1 SolrJ是什么

说明: SolrJ是访问Solr服务的Java客户端程序, 提供了索引和搜索的请求方法.

SolrJ通常嵌入在业务系统中, 通过SolrJ的API接口操作Solr服务, 流程如下图:

2 SolrJ对索引的CRUD操作

使用SolrJ访问Solr服务, 完成索引的增、删、改、查操作.

2.1 创建Maven工程(打包方式选择为jar)

2.2 配置pom.xml文件, 加入SolrJ的依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <packaging>jar</packaging> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- solrj版本 -->
<solrj.version>4.10.4</solrj.version>
<!-- log4j日志版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<!-- jcl版本 -->
<jcl.version>1.7.6</jcl.version>
<junit.version>4.12</junit.version>
</properties> <dependencies>
<!-- solrj依赖 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>${solrj.version}</version>
</dependency>
<!-- log4j日志包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${jcl.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${jcl.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies> </project>

2.3 添加和修改索引

说明: Solr是根据id域(唯一约束)执行索引的添加(或更新)的:

先根据id域执行查询, 查询到执行更新; 查询不到则执行添加.

步骤:

(1) 创建HttpSolrServer对象, 连接Solr服务;

(2) 创建文档对象(SolrInuptDocument);

(3) 使用HttpSolrServer对象, 执行添加(或更新);

(4) 提交.

/**
* 添加与修改索引
*/
@Test
public void testSaveAndUpdateIndex() throws Exception {
// 1. 创建HttpSolrServer对象, 连接Solr服务
// 参数baseURL: 指定Solr的服务地址
HttpSolrServer server = new HttpSolrServer("http://127.0.0.1:7070/solr"); // 2. 创建文档对象(SolrInputDocument)
SolrInputDocument document = new SolrInputDocument();
// 在Solr中, id域是必需的
document.addField("id", "9527");
// 先设置如下值:
// document.addField("name", "solr solrj");
// 再次设置, 测试更新索引 -- 如果存在则更新, 不存在则添加
document.addField("name", "solr123 solrj"); // 3. 使用HttpSolrServer对象, 执行添加(或更新)
server.add(document);
// 4. 提交更新
server.commit();
}

2.4 删除索引

(1) 根据id删除索引, 步骤为:

① 创建HttpSolrServer对象, 连接Solr服务;

② 使用HttpSolrServer对象, 执行删除;

③ 提交.

/**
* 根据id删除索引
*/
@Test
public void testDeleteIndexById() throws SolrServerException, IOException {
// 1. 创建HttpSolrServer对象, 连接Solr服务
// 参数baseURL: 指定Solr的服务地址
HttpSolrServer server = new HttpSolrServer("http://127.0.0.1:7070/solr"); // 2. 使用HttpSolrServer对象, 执行删除
server.deleteById("9527"); // 3. 提交
server.commit();
}

(2) 根据条件删除索引, 步骤为:

① 创建HttpSolrServer对象, 连接solr服务;

② 使用HttpSolrServer对象, 执行删除;

③ 提交.

/**
* 根据条件删除索引
*/
@Test
public void testDeleteIndexByQuery() throws Exception {
// 1. 创建HttpSolrServer对象, 连接Solr服务
HttpSolrServer server = new HttpSolrServer("http://127.0.0.1:7070/solr"); // 2. 使用HttpSolrServer对象, 执行删除
server.deleteByQuery("name: solr"); // 3. 提交更新
server.commit();
}

2.5 查询索引

查询步骤:

(1) 创建HttpSolrServer对象, 连接Solr服务;

(2) 创建查询对象(SolrQuery);

(3) 使用HttpSolrServer对象, 执行查询, 返回查询响应对象QueryResponse;

(4) 使用QueryResponse对象, 获取查询的结果集SolrDocumentList;

(5) 处理结果集.

/**
* 查询索引
*/
@Test
public void testQueryIndex() throws Exception {
// 1. 创建HttpSolrServer对象, 连接Solr服务
HttpSolrServer server = new HttpSolrServer("http://127.0.0.1:7070/solr"); // 2. 创建查询对象(Query)
// : 表示查询所有
SolrQuery query = new SolrQuery(":"); // 3.使用HttpSolrServer对象, 执行查询, 返回查询响应对象QueryResponse
QueryResponse queryResponse = server.query(query); // 4.使用QueryResponse对象, 获取查询的结果集SolrDocumentList
SolrDocumentList results = queryResponse.getResults(); // 5.处理结果集
// 打印查询到的结果数量
System.out.println("结果数量: " + results.getNumFound());
for (SolrDocument doc : results) {
System.out.println("= = = = = = = = = = = = = = = = = = =");
// 打印id域和name域
System.out.println("id: " + doc.get("id"));
System.out.println("name: " + doc.get("name"));
}
}

3 SolrJ的查询方案

3.1 实现步骤

(1) 创建HttpSolrServer对象, 连接Solr服务;

(2) 创建查询对象(SolrQuery), 设置查询条件;

(3) 使用HttpSolrServer对象, 执行查询, 返回查询响应对象(QueryResponse);

(4) 使用QueryResponse对象, 获取查询数据;

(5) 处理结果集.

3.2 示例代码

/**
* SolrJ高级查询
*/
@Test
public void queryIndexSenior() throws Exception {
// 1. 创建HttpSolrServer对象, 连接Solr服务
// 参数baseURL:指定Solr的服务地址
HttpSolrServer solrServer = new HttpSolrServer("http://127.0.0.1:7070/solr/collection1"); // 2. 创建查询对象(SolrQuery), 设置查询条件
SolrQuery solrQuery = new SolrQuery();
// 2.1 设置查询表达式
solrQuery.setQuery("花儿朵朵");
// 2.2 设置过滤条件
solrQuery.setFilterQueries("product_price:[* TO 20]");
// 2.3 设置排序sort
solrQuery.setSort("product_price", ORDER.desc);
// 2.4 设置分页: start, rows
solrQuery.setStart(0);
solrQuery.setRows(10);
// 2.5 设置显示的域列表
solrQuery.setFields("id", "product_name", "product_price", "product_catalog_name");
// 2.6 设置默认的搜索域
solrQuery.set("df", "product_name");
// 2.7 设置响应格式
solrQuery.set("wt", "json"); // 2.8 设置高亮显示
solrQuery.setHighlight(true); // 开启高亮显示
// 或者: solrQuery.setParam("hl", "true");
solrQuery.addHighlightField("product_name"); // 添加高亮显示的域
solrQuery.setHighlightSimplePre("<font color='red'>"); // 设置高亮显示的HTML标签的前缀
solrQuery.setHighlightSimplePost("<font>"); // 设置高亮显示的HTML标签的后缀 // 2.9 设置分片统计facet
solrQuery.setFacet(true); // 开启分片统计
solrQuery.addFacetField("product_catalog_name"); // 添加分片统计的域 // 3. 使用HttpSolrServer对象, 执行查询, 返回查询相应对象
QueryResponse queryResponse = solrServer.query(solrQuery); /* 处理结果集
NamedList list = (NamedList) queryResponse.getResponse().get("highlighting");
for (int i = 0; i < list.size(); i++) {
System.out.println("id=" + list.getName(i) + "高亮字段: " + list.getVal(i));
}
*/ // 4. 使用QueryResponse对象, 获取查询数据
// 4.1 获取查询结果集
SolrDocumentList results = queryResponse.getResults();
// 4.2 获取高亮显示数据
// 第一个Map的key是文档的id, 第二个Map的key是高亮显示的字段名, 第二个Map中的value是处理过的高亮显示结果集, 类型为List<String>
Map<String, Map<String, List<String>>> hlMap = queryResponse.getHighlighting();
// 4.3 获取分片统计数据
List<FacetField> facetFields = queryResponse.getFacetFields(); // 6. 处理结果集
System.out.println("结果数量:" + results.getNumFound());
for (SolrDocument doc : results) {
System.out.println("= = = = = = = = = = = = = = = = = = =");
// id, product_name, product_price, product_catalog_name
// 获取商品id
String pid = doc.get("id").toString();
// 获取商品名称: 先从高亮显示结果中获取, 若没有获取到, 再从doc中获取
String pname = "";
List<String> list = hlMap.get(pid).get("product_name");
if (null != list && list.size() > 0) {
pname = list.get(0);
} else {
pname = doc.get("product_name").toString();
} // 获取商品价格
String pprice = doc.get("product_price").toString();
// 获取商品的分类名称
String pcatalogName = doc.get("product_catalog_name").toString(); // 输出结果
System.out.println("商品id: " + pid);
System.out.println("商品名称: " + pname);
System.out.println("商品价格: " + pprice);
System.out.println("商品分类名称: " + pcatalogName);
}
}

3.3 代码搜索结果

3.4 查看分片统计数据

// 5. 处理分片统计数据(如有)
System.out.println("分片统计数据 = = = = = = = = = = = Begin");
for (FacetField field : facetFields) {
System.out.println("统计域名称: " + field.getName() + " , 统计到的组数量: " + field.getValueCount());
// 查看各个组的数量
List<Count> values = field.getValues();
for (Count count : values) {
System.out.println("组名称: " + count.getName() + " , 该组的数量: " + count.getCount());
}
}
System.out.println("分片统计数据 = = = = = = = = = = = End");

3.5 分片统计数据结果

版权声明

作者: 马瘦风

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.

Solr 09 - SolrJ操作Solr单机服务 (Solr的Java API)的更多相关文章

  1. Solr 14 - SolrJ操作SolrCloud集群 (Solr的Java API)

    目录 1 pom.xml文件的配置 2 SolrJ操作SolrCloud 1 pom.xml文件的配置 项目的pom.xml依赖信息请参照: Solr 09 - SolrJ操作Solr单机服务 (So ...

  2. 利用SolrJ操作solr API完成index操作

    使用SolrJ操作Solr会比利用httpClient来操作Solr要简单.SolrJ是封装了httpClient方法,来操作solr的API的.SolrJ底层还是通过使用httpClient中的方法 ...

  3. solr的客户端操作:使用solrj进行curd操作

    导入相关的jar包 <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-s ...

  4. Eclipse使用solrJ 7.7.0连接solr步骤

    先写一个测试类: package com.taotao.rest.solrj; import org.apache.solr.client.solrj.SolrClient; import org.a ...

  5. Solr系列四:Solr(solrj 、索引API 、 结构化数据导入)

    一.SolrJ介绍 1. SolrJ是什么? Solr提供的用于JAVA应用中访问solr服务API的客户端jar.在我们的应用中引入solrj: <dependency> <gro ...

  6. Solr使用solr4J操作索引库

    Solrj是Solr搜索服务器的一个比较基础的客户端工具,可以非常方便地与Solr搜索服务器进行交互.最基本的功能就是管理Solr索引,包括添加.更新.删除和查询等.对于一些比较基础的应用,用Solj ...

  7. 使用SolrJ客户端管理SolrCloud(Solr集群)

    1.使用SolrJ客户端管理SolrCloud(Solr集群). package com.taotao.search.service; import java.io.IOException; impo ...

  8. Solr入门和实践以及我对Solr的8点理解

    友情提示Solr的内容还是比较多的,一篇文章只能讲解一部分.全面介绍,没兴趣,没时间,也没能力,回报还不大.本文只写点我认为比较重要的知识点,独特的个人想法.仅供参考哦,更多细节需要自己去琢磨. 概述 ...

  9. HDFS shell操作及HDFS Java API编程

    HDFS shell操作及HDFS Java API编程 1.熟悉Hadoop文件结构. 2.进行HDFS shell操作. 3.掌握通过Hadoop Java API对HDFS操作. 4.了解Had ...

随机推荐

  1. Linux之环境搭建(一)

    四大系统比较 Mac OS是苹果机专用系统,是基于Unix内核的图形化操作系统,因此Unix相当于父亲,Linux和Mac OS是对兄弟. CentOS是从Redhat源代码编译重新发布版.CentO ...

  2. VMware14 安装CentOS7 实现宿主机ping通虚拟机、虚拟机ping通宿主机、虚拟机能上网且能ping通百度

    本文旨在通过通过虚拟机VMware14来安装CentOS7 系统,并配置固定IP来实现在Windows系统中使用Linux环境. 本文目录: 0.本机环境 1.VMware14 初始化 1.1.安装V ...

  3. Response输出excel设置文本样式

    在网上查了些Response导出excel然后设置样式的方法,发现没有一个可行的于是开始自己研究, 发现可以通过输出样式的方式进行配置,我要设置的是全文本格式在excel样式是这样的mso-numbe ...

  4. 刚学的vue.js的单一事件管理组件通信

    第一次在博客园写的技术分享,写的不好的话各位大神多体谅,好啦进入主题 说说思路 首先 第一步,准备一个空的示例对象 var Event=new Vue(); 第二步,准备发送的数据 Event.$em ...

  5. FCC学习笔记(二)

    Nest an Anchor Element within a Paragraph 作为参考,再次看一看a元素的图示: 例如: <p>Here's a <a href="h ...

  6. hyperopt自动调参

    hyperopt自动调参 在传统机器学习和深度学习领域经常需要调参,调参有些是通过通过对数据和算法的理解进行的,这当然是上上策,但还有相当一部分属于"黑盒" hyperopt可以帮 ...

  7. mybatis 之数据库 include refid ="base_column_list"

    mybatis 之数据库 include refid ="base_column_list" 对于刚学习使用SSM框架的新手来说,mybatis中的数据库语句有点不一样,下面便是对 ...

  8. 一步一步 copy163: 网易严选 ---- vue-cli

    面试点 组件间通信 生命周期函数 路由 - 参数 - 重定向 vuex 参考 网易严选商城小程序全栈开发,域名备案中近期上线(mpvue+koa2+mysql) 小程序服务端源码地址 小程序源码地址 ...

  9. 基础SQL语句用法

    1.插入数据:Insert 2.更新数据:update 每行金额增加100 3.删除数据:delete 4.查询:select 1)精确查询 2)模糊查询:like 模糊查询  % 匹配 3)Betw ...

  10. 利用redis + lua解决抢红包高并发的问题

    抢红包的需求分析 抢红包的场景有点像秒杀,但是要比秒杀简单点.因为秒杀通常要和库存相关.而抢红包则可以允许有些红包没有被抢到,因为发红包的人不会有损失,没抢完的钱再退回给发红包的人即可.另外像小米这样 ...