SolrJ是访问Solr服务器的Java客户端。
注:Solrj和图形界面操作的区别就类似于操作数据库时,使用jdbc和mysql客户端(如:navicat)的区别一样。
声明:此示例的软硬件环境为:Windows、Eclipse、JDK1.8、Solr7.3.0
提示:这里主要给出普通项目使用SolrJ的示例,在本文最后,会给出SpringBoot要使用SolrJ的话,需要哪些微调整。
找到解压后文件夹下的dist目录,复制solr-solrj的jar包至Java项目中
找到解压后文件夹下的dist/solrj-lib目录,复制其内所有的jar包至Java项目中
注:这里是有slf4j-api接口的jar包,并没有给我们提供日志框架的实现,所以我们还需要选择日志框架的实现,导入Java项目中(本人选择logback作为日志框架的实现)
此时,Java项目中的jar包应有:
/**
* Solr---查询
*
* @date 2018年8月9日 上午9:48:14
*/
public void solrQuery() {
// 指定要连接的SolrCore
String solrUrl = "http://127.0.0.1:8983/solr/solr_core";
// 创建Solr客户端(注:与HttpClient类似)
HttpSolrClient httpSolrClient = new HttpSolrClient.Builder(solrUrl)
.withConnectionTimeout(60000)
.withSocketTimeout(20000)
.build();
// 创建SolrQuery对象
SolrQuery query = new SolrQuery();
/*
* 输入查询条件 注:且用“AND”, 或用“OR”;这里不能能进行多复杂的筛选,如果想进一步筛选可配置下面的过滤
*/
query.setQuery("product_name:别致 OR product_name:欧式");
/// 或查询时不指定域,但是给其配置默认域
// query.setQuery("笔记本");
// query.set("df", "product_name");
// 或这样
// query.set("q", "product_name:笔记本");
// 设置过滤条件
query.setFilterQueries("product_price:[1 TO 80]");
/// 再给出几个示例
// query.setFilterQueries("id:2009");
// query.setFilterQueries("product_price:[1 TO 100] AND id:[2000 TO 2009]");
// query.setFilterQueries("product_price:[1 TO 10] OR product_price:[30 TO 40]");
// 排序设置(这里按价格降序)
query.setSort("product_price", ORDER.desc);
// 设置次级排序(这里即:当product_price一样时,按id升序排列),如果还要再设置次级的话,那么再进行此步骤即可
query.addSort("id", ORDER.asc);
// 设置分页信息(默认为:0,10)
query.setStart(0);
query.setRows(100);
// 设置查询的Field(即:设置要查询的列)
query.setFields("id", "product_name", "product_price", "product_picture");
// 设置对应域中,对应的“查询条件”字段高亮显示
query.setHighlight(true);
query.addHighlightField("product_name");
query.setHighlightSimplePre("[>>>");
query.setHighlightSimplePost("<<<<]");
try {
// 执行查询并返回结果
QueryResponse response = httpSolrClient.query(query);
System.out.println(">>>>>>>>>>" + httpSolrClient.query(query).getHeader());
// 从响应中获取到查询结果文档
SolrDocumentList solrDocumentList = response.getResults();
// 匹配结果总数
long count = solrDocumentList.getNumFound();
System.out.println("匹配结果总数:" + count);
// 遍历查询结果
// 获取高亮显示信息
Map>> highlighting = response.getHighlighting();
for (SolrDocument doc : solrDocumentList) {
System.out.println("id:" + doc.get("id"));
System.out.println("商品名:" + doc.get("product_name"));
// 处理高亮显示的结果
List list2 = highlighting.get(doc.get("id")).get("product_name");
if (list2 != null) {
System.out.println("商品名称中满足查询条件,再次(高亮)显示商品名:" + list2.get(0));
}
System.out.println("价格:" + doc.get("product_price"));
System.out.println("图片:" + doc.get("product_picture"));
System.out.println("------------------华丽分割线------------------");
}
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
// 关闭客户端,释放资源
httpSolrClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
给出调用此方法后consoles输出结果截图(部分):
/**
* Solr---新增/修改(有该id则修改,无该id则新增)
*
* @date 2018年8月9日 下午9:12:57
*/
public void solrAddOrUpdate() {
// 指定要连接的SolrCore
String solrUrl = "http://127.0.0.1:8983/solr/solr_core";
// 创建Solr客户端(注:与HttpClient类似)
HttpSolrClient httpSolrClient = new HttpSolrClient.Builder(solrUrl)
.withConnectionTimeout(60000)
.withSocketTimeout(20000)
.build();
// 创建文档doc
SolrInputDocument document = new SolrInputDocument();
/*
* 添加内容 注:参数分别是:(域名,对应的值) 注:域的名称必须是在schema.xml中定义的 注:id域一定要有
*/
document.addField("id", "12345");
document.addField("name", "邓沙利文");
document.addField("title", "测试solrAddOrUpdate");
try {
// 执行add并返回结果
UpdateResponse updateResponse = httpSolrClient.add(document);
System.out.println("方法操作耗时(毫秒)......" + updateResponse.getElapsedTime());
// 这里必须要commit提交
httpSolrClient.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 关闭客户端,释放资源
httpSolrClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我们先查一下有没有id为12345的索引(使用Solr图形界面更直观):
此时,没有id为12345的索引。
我们调用运行上述方法后,再查一下:
此时,有id为12345的索引了,说明新增索引成功!
我们将方法中的name域的值改为“JustryDeng”,再调用运行一下该方法后,再查一下:
此时,查出来的结果变了,说明修改索引成功!
/**
* Solr---删除
*
* @date 2018年8月9日 下午9:36:05
*/
public void solrDelete() {
// 指定要连接的SolrCore
String solrUrl = "http://127.0.0.1:8983/solr/solr_core";
// 创建Solr客户端(注:与HttpClient类似)
HttpSolrClient httpSolrClient = new HttpSolrClient.Builder(solrUrl)
.withConnectionTimeout(60000)
.withSocketTimeout(20000)
.build();
try {
// 执行删除
httpSolrClient.deleteByQuery("id:12345");
// 再给出两种常用的删除方式
// httpSolrClient.deleteById(String id)
// httpSolrClient.deleteById(List ids)
// 这里必须要commit提交
httpSolrClient.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 关闭客户端,释放资源
httpSolrClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
调用运行上述删除方法前,我们先查一下id为12345的索引是否存在:
如上图,id为12345的索引是存在的。
运行上述方法,再查询id为12345的索引是否存在:
由此可见,删除索引成功。
注意事项
org.springframework.data
spring-data-solr
org.springframework.data
spring-data-solr
注:SpringBoot中默认集成了logback、solr等,所以我们只需要在这里引入依赖(不需要指定版本,因为其内部已经默认了要使用哪一个版本)即可。
但是注意一点:高版本的Solr才支持此创建Solr客户端的方式:
如果是低版本的Solr,需要这么创建Solr客户端: