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. 从Facebook数据泄露事件看大数据时代的个人信息安全问题

    进入21世纪后,互联网开始大规模普及,线上业务和线上服务也开始逐渐走入人们的生活.尤其在智能手机和移动互联网诞生以后,人们对网络的依赖更是与日俱增.然而,伴随而来的则是涉及个人隐私的信息安全问题.个人 ...

  2. [转]webpack中require和import的区别

    webpack中可以写commonjs格式的require同步语法,可以写AMD格式的require回调语法,还有一个require.ensure,以及webpack自己定义的require.incl ...

  3. IO多路复用,同步,异步,阻塞和非阻塞 区别(转)

    转自:http://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral 同步.异步 是 ...

  4. linux仅修改文件夹权限 分别批量修改文件和文件夹权限

    比如我想把/var/www/html下的文件全部改成664,文件夹改成775,怎么做呢 方法一: 先把所有文件及文件夹改成664,然后把所有文件夹改成775 chmod -R 664 ./ find ...

  5. SDN网络虚拟化中有效协调的映射算法

    来自论文An efficient and coordinated mapping algorithm in virtualized SDN networks,来自期刊<信息与电子工程前沿> ...

  6. 小白学习随笔the first week

    The First Week 一.计算机基础 1.软件(应用程序) 2.解释器/编译器 - 解释型语言:将代码每一行传递给计算机一行,常用编程语言python,PHP,Ruby. - 编译型语言:将代 ...

  7. Linux系统下,在文件中查找某个字符串

    在normal模式下按下/即可进入查找模式,输入要查找的字符串并按下回车. Vim会跳转到第一个匹配.按下n查找下一个,按下N查找上一个. Vim查找支持正则表达式,例如/vim$匹配行尾的" ...

  8. centos为docker配置加速器

    国内拉去docker镜像慢得可怜,为了解决这个问题,可为docker配置加速器. 1.修改daemon配置文件 sudo mkdir -p /etc/dockervim /etc/docker/dae ...

  9. 多个router和多个network

    一般搭建成功了opentack后,都会按照文档的这样创建网络 Scenario 1: one tenant, two networks, one router Scenario 2: two tena ...

  10. Egg 中 Controller 最佳实践

    得益于 JavaScript 加入的 decorator 特性,可以使我们跟 Java/C# 一样,更加直观自然的,做面向切面编程.而随着 TypeScript 的成熟,类型系统也让我们增强了信心,面 ...