什么是SolrJ?

SolrJ是访问Solr服务的Java客户端,提供索引(这里指的就是创建索引、更新索引以及删除索引)和搜索(这里指的是查询索引)的请求方法,SolrJ通常嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图所示。

使用SolrJ管理索引库

添加文档

初学者不妨思考一下添加文档这一操作的实现步骤,你尽管想,想出来算我输!我还是直接老老实实把实现步骤写出来吧!

  • 第一步:创建一个普通的Java工程,例如SolrJ。
  • 第二步:向Java工程中导入jar包。你不仅要问,应该导入哪些jar包呢?首先导入SolrJ核心jar包(即solr-solrj-8.4.0.jar)和该核心jar包所依赖的那些jar包。
    除此之外,还应导入一些有关日志的jar包,它们位于solr-8.4.0\server\lib\ext目录中。
    在导入以上这些jar包的过程中,如果有重复的替换就行了。
  • 第三步:和Solr服务器建立连接。由于咱们搭建的是单机版的Solr服务器,所以使用HttpSolrClient对象建立连接即可。
  • 第四步:创建一个SolrInputDocument对象,然后添加若干域。
  • 第五步:将SolrInputDocument对象添加到索引库中去,然后提交(手动提交)即可。
  • 第六步:断开与Solr服务器的连接。

看你能不能对应着以上的实现步骤,将代码给整出来。整不出来也没关系,下面我会直接给出实现代码。

package com.meimeixia.solrj;import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;/*** 使用SolrJ管理索引库* 添加文档* 删除文档* 修改文档* 查询文档* @author liayun**/
public class SolrJManager {// 添加文档@Testpublic void testAdd() throws Exception {String baseURL = "http://localhost:8080/solr/collection1"; // Solr服务器的地址,特别指定核1// String baseURL = "http://localhost:8080/solr/collection2"; // Solr服务器的地址,特别指定核2// 和单机版Solr服务器建立连接SolrClient solrClient = new HttpSolrClient.Builder(baseURL).withConnectionTimeout(10000).withSocketTimeout(60000).build(); // 至此,终于连上了Solr服务器// 创建一个文档对象SolrInputDocument doc = new SolrInputDocument();// 向文档中添加域/* * setField方法中的两个参数的说明如下:*       第一个参数:域的名称,域的名称必须是在managed-schema配置文件中定义好的,也就是说这个域必须存在*        第二个参数:域的值*/doc.setField("id", "haha");doc.setField("name", "范冰冰");// 把文档对象添加到索引库中solrClient.add(doc);solrClient.commit(); // 手动提交,当然了,也可以自动提交// 断开与Solr服务器的连接solrClient.close();}
}

删除文档

根据id删除

要想根据id删除文档,只须在以上SolrJManager类中添加一个如下方法即可。

// 删除文档(根据id删除)
@Test
public void testDeleteDocumentById() throws Exception {String baseURL = "http://localhost:8080/solr/collection1"; // Solr服务器的地址,特别指定核1// 和单机版Solr服务器建立连接SolrClient solrClient = new HttpSolrClient.Builder(baseURL).withConnectionTimeout(10000).withSocketTimeout(60000).build(); // 至此,终于连上了Solr服务器// 根据id删除文档solrClient.deleteById("haha");// 断开与Solr服务器的连接solrClient.close();
}

根据查询语法删除

Solr中的查询语法完全支持Lucene的查询语法。例如,我们可以根据*:*查询语法来删除全部文档,具体的实现代码如下。

// 删除文档(根据查询语法删除)
@Test
public void testDeleteDocumentByQuery() throws Exception {String baseURL = "http://localhost:8080/solr/collection1"; // Solr服务器的地址,特别指定核1// 和单机版Solr服务器建立连接SolrClient solrClient = new HttpSolrClient.Builder(baseURL).withConnectionTimeout(10000).withSocketTimeout(60000).build(); // 至此,终于连上了Solr服务器// 根据查询语法(*:*)删除全部文档solrClient.deleteByQuery("*:*", 1000);// 断开与Solr服务器的连接solrClient.close();
}

更新文档

在SolrJ中没有对应的update方法来更新文档,只有add方法,更新文档其实就跟添加文档一模一样,只需要添加一个新的文档,和被修改的文档id一致就可以更新了,本质上就是先删除后添加。

现在,你该知道如何更新文档了吧!那么下面的这个方法的代码你能补充完整了吗?

// 更新文档
@Test
public void testUpdate() throws Exception {String baseURL = "http://localhost:8080/solr/collection1"; // Solr服务器的地址,特别指定核1// 和单机版Solr服务器建立连接SolrClient solrClient = new HttpSolrClient.Builder(baseURL).withConnectionTimeout(10000).withSocketTimeout(60000).build(); // 至此,终于连上了Solr服务器// 更新文档与添加文档一致,只要文档id相同就是更新,文档id不同就是添加// 所以,这里就不写下去了
}

查询文档

简单查询

之前使用Solr的后台管理界面来查询所有文档,是怎么做的,不知你还记得吗?

上面的这一操作怎么通过代码来实现呢?不知你有没想过,没想过也没关系,下面我会给出具体的实现代码。

// 查询文档(简单查询)
@Test
public void testSearch() throws Exception {String baseURL = "http://localhost:8080/solr/collection1"; // Solr服务器的地址,特别指定核1// 和单机版Solr服务器建立连接SolrClient solrClient = new HttpSolrClient.Builder(baseURL).withConnectionTimeout(10000).withSocketTimeout(60000).build(); // 至此,终于连上了Solr服务器// 创建一个SolrQuery对象SolrQuery solrQuery = new SolrQuery();// 设置查询条件(查询所有)solrQuery.setQuery("*:*"); // 其实,这句代码还能写成solrQuery.set("q", "*:*");// 执行查询QueryResponse response = solrClient.query(solrQuery); // query方法中需要传入的参数是一个SolrParams抽象类,// 而SolrQuery就是其一个实现子类,所以,这里传入一个SolrQuery对象// 获取文档结果集SolrDocumentList docs = response.getResults();// 总条数long numFound = docs.getNumFound();System.out.println("总条数:" + numFound);// 遍历文档结果集for (SolrDocument doc : docs) {System.out.println(doc.get("id"));System.out.println(doc.get("product_name"));System.out.println(doc.get("product_price"));System.out.println(doc.get("product_catalog_name"));System.out.println(doc.get("product_picture"));}// 断开与Solr服务器的连接solrClient.close();
}

运行以上方法,你将会看到Eclipse控制台打印出了如下图所示的结果。

复杂查询

复杂查询的实现代码写起来就比较复杂了,因为它其中包含了查询、过滤、分页、排序、高亮显示等处理。

想一想,之前要是使用Solr的后台管理界面来实现这样的复杂查询,是不是应该像下面这样子操作呢?

这里我们要注意,一个容器用于存放一大堆正常的文档,另一个容器专门用于存放高亮显示的结果,而且这两个容器不是放在一起的。

那么现在要写代码来实现这样一个比较复杂的查询,包含了按条件查询、条件过滤、排序、分页、高亮显示以及获取部分域信息等,最终的实现代码是怎样子的呢?是不是类似下面这样啊!

// 查询文档(复杂查询)
@Test
public void testSearch2() throws Exception {String baseURL = "http://localhost:8080/solr/collection1"; // Solr服务器的地址,特别指定核1// 和单机版Solr服务器建立连接SolrClient solrClient = new HttpSolrClient.Builder(baseURL).withConnectionTimeout(10000).withSocketTimeout(60000).build(); // 至此,终于连上了Solr服务器/** 需求:在综合查询中,按条件查询、条件过滤、排序、分页、高亮显示、获取部分域信息*/SolrQuery solrQuery = new SolrQuery(); // 设置查询条件// solrQuery.setQuery("product_name:台灯"); // 其实,这句代码还能写成solrQuery.set("q", "product_name:台灯");solrQuery.setQuery("台灯"); // 因为指定了默认搜索域为product_name,所以product_name:就可以省略不写了// 过滤条件(要求过滤出商品分类名称为"幽默杂货"的商品信息)solrQuery.set("fq", "product_catalog_name:幽默杂货");// 过滤条件(要求过滤出价格在10元以下的商品信息,即按价格区间进行搜索)solrQuery.set("fq", "product_price:[* TO 10]"); // 10元以下的(包含10元)// 按照价格进行降序排序solrQuery.addSort("product_price", ORDER.desc); // 其实,这句代码也可以写成solrQuery.addSort("product_price desc")这样// 分页solrQuery.setStart(0); // 从第几条记录开始solrQuery.setRows(5); // 返回结果最多有多少条记录// 指定默认搜索域solrQuery.set("df", "product_name");// 指定只查询指定域(你不是有5、6个域吗,但是我只想要2个域,行不行?)solrQuery.set("fl", "id,product_name");// 高亮// 1. 首先开启高亮开关solrQuery.setHighlight(true);// 2. 指定高亮的域solrQuery.addHighlightField("product_name");// 3. 设置高亮前缀solrQuery.setHighlightSimplePre("<span style='color:red'>");// 4. 设置高亮后缀solrQuery.setHighlightSimplePost("</span>");// 执行查询QueryResponse response = solrClient.query(solrQuery); // query方法中需要传入的参数是一个SolrParams抽象类,// 而SolrQuery就是其一个实现子类,所以,这里传入一个SolrQuery对象// 获取文档结果集SolrDocumentList docs = response.getResults();// 获取高亮显示的结果集,高亮显示的结果集和查询结果集是分开放的Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();// 第一个Map:key为id,value为Map // 第二个Map:key为域名,value为List // List里面可以多个,但本次是一个,即list.get(0)// 总条数long numFound = docs.getNumFound();System.out.println("总条数:" + numFound);// 遍历for (SolrDocument doc : docs) {System.out.println(doc.get("id"));System.out.println(doc.get("product_name"));System.out.println(doc.get("product_price"));System.out.println(doc.get("product_catalog_name"));System.out.println(doc.get("product_picture"));System.out.println("-------------------------------------------------------------");Map<String, List<String>> map = highlighting.get(doc.get("id"));List<String> list = map.get("product_name");System.out.println(list.get(0));}// 断开与Solr服务器的连接solrClient.close();
}

运行以上方法,你将会看到Eclipse控制台打印出了如下图所示的结果。

Solr快速入门第七讲——使用SolrJ管理索引库相关推荐

  1. 树莓派从零开始快速入门第0讲——环境安装

    树莓派从零开始快速入门第0讲--环境安装 目录 树莓派从零开始快速入门第0讲--环境安装 一.前言 二.硬件准备 1. 树莓派(必选) 2. SD卡(必选) 3. 读卡器(必选) 4. 电源(必选) ...

  2. 树莓派从零开始快速入门第8讲——单总线(以DS18B20为例)

    树莓派从零开始快速入门第8讲--单总线(以DS18B20为例) 目录 树莓派从零开始快速入门第8讲--单总线(以DS18B20为例) 一.前言 二.硬件连接 三.使能1-write接口 四.通讯测试 ...

  3. 树莓派从零开始快速入门第5讲——点亮LED

    树莓派从零开始快速入门第5讲--点亮LED 目录 树莓派从零开始快速入门第5讲--点亮LED 一.前言 二.引脚对照表 三.硬件连接 四.编写程序 1.编程方式简述 2.python编程 五.结束语 ...

  4. 树莓派从零开始快速入门第9讲——串口

    树莓派从零开始快速入门第9讲--串口 目录 树莓派从零开始快速入门第9讲--串口 一.前言 二.配置串口 三.串口收发测试 1.查询端口 2.串口调试 四.程序编写并运行 五.结束语 一.前言 串口是 ...

  5. 树莓派从零开始快速入门第14讲——摄像头

    树莓派从零开始快速入门第14讲--摄像头 目录 树莓派从零开始快速入门第14讲--摄像头 一.前言 二.硬件准备 三.软件配置 1.打开图形化窗口 2.下载并运行motion 3.查看监控画面 4.配 ...

  6. 淘淘商城第52讲——使用SolrJ查询索引库

    我们有必要在工程中正式编写查询索引库的代码之前先进行必要的测试. 我们先到Solr应用的页面去简单进行一下查询,如下图所示,在搜索条件q这一栏中,我们输入手机这样的关键字,分页参数中的每页显示条数我们 ...

  7. maven快速入门第十七讲——从私服下载jar包到本地仓库

    没有配置nexus之前,如果本地仓库没有,那么会去中央仓库下载,通常在企业中会在局域网内部署一台私服服务器,有了私服之后,本地项目会首先去本地仓库找jar包,如果没有找到则连接私服从私服下载jar包, ...

  8. 零基础语法入门第七讲 实意动词的特征

    之前讲过Be动词,起到联系作用,通常没有什么实在意义.实意动词指的是具有实在意义的动词. 实意动词如: come ,read ,go,watch,play,fly. 1.He comes from S ...

  9. Windows系统环境下Solr之Java实战(三)使用solrJ管理索引库

    https://www.cnblogs.com/zhuxiaojie/p/5764680.html https://www.cnblogs.com/xieyupeng/p/9317158.html 转 ...

最新文章

  1. Quick Cocos2dx 初步战斗
  2. 权威专家首次回应宠物能否传播新型肺炎:接触到疫情需要监控
  3. 【原】高清显示屏原理及设计方案
  4. Keil编译报错:Cannot open include file: 'stdbool.h': No such file or directory问题解决
  5. Linux系统编程下做一个简易的shell
  6. 1-2docker-基本的使用
  7. LeetCode 1340. 跳跃游戏 V(DP)
  8. HTML+CSS+JS实现美女canvas仿ps橡皮擦刮刮卡
  9. DMA驱动开发(6,参考资料)有用链接
  10. 暴风影音使用技巧十则
  11. 数据的分析的方法及评价指标总结
  12. 打字拼音软件测试,学打字练打字
  13. 如何使用Three.js为3D模型构建Color Customizer应用
  14. 怎样推导圆面积计算公式?
  15. 苹果恢复出厂设置系统也会还原吗_刷机、恢复出厂设置和还原设置,你还不知道有什么区别?...
  16. 基于android的共享车位app
  17. linux查看显示器名称命令,linux 查看显示器信息Linux下查看硬件信息命令大全
  18. 什么是软件生命周期模型?试比较瀑布模型、快速原型模型、增量模型和螺旋模型的优缺点,说明每种模型的使用范围。
  19. 一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历...
  20. 物流行业SCM供应链协同系统全国仓库网络集中管理,实现全局掌控

热门文章

  1. 物联网平台功能解析(一):“不赚钱”的连接管理平台
  2. 茆诗松《贝叶斯统计》第二版勘误
  3. 陈天桥雒芊芊伉俪助阵盛大 “爱心传递”慈善拍卖,捐出丰子恺爱女画作
  4. 5.请编写一个函数void fun(int m,int k,int xx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入xx所指的数组中。
  5. hdp3.1.4 hive 开启lzo压缩
  6. 2022第十三届蓝桥杯省赛C/C++B组 真题题解
  7. 十三届蓝桥杯单片机组省赛真题程序解析
  8. 嵌入式QT--静态编译
  9. 小学计算机教案河南大学版,河南大学出版社-小学信息技术第二册(下)教案.doc...
  10. 神经网络图用什么软件做,神经网络如何识别图像