企业级搜索应用服务器Solr4.10.4部署开发详解(3)- Solr使用-使用java客户端solrj进行增删改查开发

本文主要是介绍企业级搜索应用服务器Solr4.10.4部署开发详解(3)- Solr使用-使用java客户端solrj进行增删改查开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(一)使用java客户端solrj进行增删改查开发

        前两章讲的是如何搭建部署Solr环境和使用Solr创建数据集合进行存储查询,下面我们需要更进一步,直接使用客户端API进行开发,直接操作数据集合,进行增删改查。

1. 加入客户端API的jar包

使用客户端API的jar包有两种方式,一种是maven依赖,另外一种是下载jar包添加到path环境中。这里只说maven依赖,下载jar包我不说,但是我提供jar以及相关依赖包供你下载,点击jolrj依赖jar包(http://pan.baidu.com/s/1pJ209ZX),进行下载

<dependency><groupId>org.apache.solr</groupId><artifactId>solr-solrj</artifactId><version>4.10.4</version>
</dependency>

增加这个maven依赖后,会自动下载下面10jar包


2. 编写数据访问接口层

包的依赖问题解决后,我们就可以直接在项目中使用solrj客户端进行开发了,还记得上一章里创建【schema.xml】里的字段吗,这次咱们就创建的实体类字段就应该对上,连大小写,下划线都不能有差别。


先写模型类代码,这个里面引入了一个Fieid类,在每个参数定义前注解,如果不注解,存储时就会提示存储异常,字段对应不上,相当于做了类似序列化之类的工作。最复杂的应该是查询部分,设置参数时,名称需要看SolrQuery的API。

Items类

import org.apache.solr.client.solrj.beans.Field;/*** @author shuang* */
public class Items {/** 编号 */@Fieldprivate Integer id;/** 名称 */@Fieldprivate String name;/** 价格 */@Fieldprivate double price;/** 图片 */@Fieldprivate String display_picture;/** 时间 */@Fieldprivate Integer release_time;/** 状态 */@Fieldprivate Integer release_state;/** 交易量 */@Fieldprivate Integer deals;/** 浏览量 */@Fieldprivate Integer hits;public String toString() {StringBuffer sb = new StringBuffer();sb.append("编号:").append(id);sb.append(", 名称:").append(name);sb.append(", 价格:").append(price);sb.append(", 交易量:").append(deals);sb.append(", 浏览量:").append(hits);sb.append(", 时间:").append(release_time);return sb.toString();}/*** 获取id 的值* * @return the id*/public Integer getId() {return id;}/*** 设置id 的值* * @param id*            the id to set*/public void setId(Integer id) {this.id = id;}/*** 获取name 的值* * @return the name*/public String getName() {return name;}/*** 设置name 的值* * @param name*            the name to set*/public void setName(String name) {this.name = name;}/*** 获取price 的值* * @return the price*/public double getPrice() {return price;}/*** 设置price 的值* * @param price*            the price to set*/public void setPrice(double price) {this.price = price;}/*** 获取deals 的值* * @return the deals*/public Integer getDeals() {return deals;}/*** 设置deals 的值* * @param deals*            the deals to set*/public void setDeals(Integer deals) {this.deals = deals;}/*** 获取hits 的值* * @return the hits*/public Integer getHits() {return hits;}/*** 设置hits 的值* * @param hits*            the hits to set*/public void setHits(Integer hits) {this.hits = hits;}/*** 获取display_picture 的值* * @return the display_picture*/public String getDisplay_picture() {return display_picture;}/*** 设置display_picture 的值* * @param display_picture*            the display_picture to set*/public void setDisplay_picture(String display_picture) {this.display_picture = display_picture;}/*** 获取release_time 的值* * @return the release_time*/public Integer getRelease_time() {return release_time;}/*** 设置release_time 的值* * @param release_time*            the release_time to set*/public void setRelease_time(Integer release_time) {this.release_time = release_time;}/*** 获取release_state 的值* * @return the release_state*/public Integer getRelease_state() {return release_state;}/*** 设置release_state 的值* * @param release_state*            the release_state to set*/public void setRelease_state(Integer release_state) {this.release_state = release_state;}}


然后继续编写测试类,测试类的url中test/test,前面一个test是项目名称,后面是数据集合名称,在solr中创建的数据集合名称与模型类名称可以不同

/*** @author shuang**/
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;import org.apache.commons.beanutils.BeanUtils;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.params.ModifiableSolrParams;import com.bbmm.mbs.model.Items;
import com.bbmm.mbs.model.Services;public class SolrTest {private final static String url = "http://localhost:8080/test/test";public static void main(String[] args) {new SolrTest().add();
//		new SolrTest().delete();
//		 new SolrTest().update();
//		 new SolrTest().query();}/*** 添加*/public void add() {try {HttpSolrServer server = getSolrServer();List<Items> list = new ArrayList<Items>();for(int i = 0 ; i < 5;i++){Items item = new Items();item.setId(i+1);item.setName("item_" + (i+1));item.setPrice(500 * i);item.setRelease_time((int) (System.currentTimeMillis() /1000));item.setDeals(10 +i);item.setHits(50 * i);list.add(item); }server.addBeans(list);server.commit();System.out.println("添加完成");} catch (SolrServerException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** 删除*/public void delete() {try {HttpSolrServer server = getSolrServer();server.deleteById("1");server.commit();System.out.println("删除完成");} catch (SolrServerException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** 修改* **/public void update() {try {HttpSolrServer server = getSolrServer();Items item = new Items();item.setId(2);item.setName("item_modify");item.setPrice(5009);item.setRelease_time((int) (System.currentTimeMillis() /1000));item.setDeals(109);item.setHits(509);server.addBean(item);server.commit();System.out.println("修改完成");} catch (IOException e) {e.printStackTrace();} catch (SolrServerException e) {e.printStackTrace();}}/*** 查询*/@SuppressWarnings("unchecked")public void query() {try {HttpSolrServer server = getSolrServer();ModifiableSolrParams params = new ModifiableSolrParams();params.set("q", "id:1"); // q表示查询字符串
params.set("start", 0); // start是开始记录数 分页用
params.set("rows", 3); // rows是返回记录条数 分页用
params.set("sort", "price desc");//sort是排序字段 字段名 排序类型
params.set("fl", "id,name,price,releaseTime,deals,hits"); //fl是 fieldlist缩写,就是需要返回的字段列表,用逗号和空格隔开QueryResponse response = server.query(params);SolrDocumentList results = response.getResults();if (!results.isEmpty()) {List<Services> list = toBeanList(results, Services.class);for (Services s : list) {System.out.println(s);}}System.out.println("参数查询完成");} catch (SolrServerException e) {e.printStackTrace();}}/*** Solr文档对象转Java对象* * @param <E>* @param record* @param clazz* @return Object*/public static Object toBean(SolrDocument record, Class<Object> clazz) {Object o = null;try {o = clazz.newInstance();} catch (InstantiationException e) {System.out.println("Solr文档对象转Java对象实例化异常:" + e.getMessage());} catch (IllegalAccessException e) {System.out.println("Solr文档对象转Java对象非法访问异常:" + e.getMessage());}Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {// log.warn("------------" + record.toString());Object value = record.get(field.getName());try {if (value != null) {BeanUtils.setProperty(o, field.getName(), value);}} catch (IllegalAccessException e) {System.out.println("Solr文档对象转Java对象方法非法访问异常:" + e.getMessage());} catch (InvocationTargetException e) {System.out.println("Solr文档对象转Java对象调用目标异常:" + e.getMessage());}}return o;}@SuppressWarnings({ "rawtypes", "unchecked" })public static List toBeanList(SolrDocumentList records, Class clazz) {List list = new ArrayList();for (SolrDocument record : records) {list.add(toBean(record, clazz));}return list;}private HttpSolrServer solrServer = null;// solrServer是线程安全的,所以在使用时需要使用单例的模式,减少资源的消耗public HttpSolrServer getSolrServer() {if (solrServer == null) {solrServer = new HttpSolrServer(url);}return solrServer;}
}


3. 测试数据增删改查

在SolrTest.java类中依次打开注释运行add、delete、update、query来感受一下Solr的增删改查功能,你就会发现她的魅力所在,当然,如果你要找到更大的成就感和快感,就需要更专心的学习Solr的API了



运行完成,在浏览器【http://localhost:8080/test/#/test/query】里,query选项中,通过查询,能看到刚才存储进去的数据,如果你再运行delete方法,再查询,就看不到编号为1的记录了。如果修改,就会看到数据内容的变更,查询就更要自己体会了。




总结:

到此,Solr单机的搭建部署、配置和java环境的开发已经全部完成。demo中的内容比较简单,是为了尽快写出文章与大家共勉,望大家谅解。其实Solr中还有很多更强大的功能待大家探索,比如联合索引、模糊字段匹配存储、中文分词等等。当然,这些功能,我会抽空写出一些文章供大家参考,共同学习,我也是三天前才接触Solr,所以写出来记录和加深自己印象,文中有不对的地方和建议,希望不吝赐教。


这篇关于企业级搜索应用服务器Solr4.10.4部署开发详解(3)- Solr使用-使用java客户端solrj进行增删改查开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/799233

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个