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. python之socketserver实现并发

    python之socketserver实现并发 服务端 import socketserver #socketserver模块是用来实现并发 # 我们自己的类里一定要继承socketserver.Ba ...

  2. 关于DataTable序列化的事儿

    今天写了一个小demo,从数据库中读取到了dataTable,想序列化成json字符串,然后传到前端,进行页面展示,其实很简单的一个步骤,谁知道它出错了!!! 出错的原因是:序列化类型为XX的对象时检 ...

  3. Windows本地代码仓库使用连接教程

    目录 软件安装 修改语言为中文 克隆远程仓库 文件上传教程 软件安装 安装Git(软件下载链接) 根据自己的系统选择对应版本下载安装 安装TortoiseGit(软件下载链接) 1.下载完毕解压文件夹 ...

  4. VS2017简单使用

    1. 2.删除下面的文件 3.点击属性 4.改为否 不使用预编译头 万能头文件自己导入网上有教程

  5. centos7安装tomcat8.5

    1.下载 tomcat Linux 版本 tomcat 官网下载地址:http://tomcat.apache.org/download-80.cgi 百度云盘链接:链接: https://pan.b ...

  6. 安装使用eclipse

    安装使用eclipse 目标 java学习需要,老师说要安装eclipse,,其实已经下了IDEA了,不过还是听老师的比较好( 准备 jre 也就是java运行环境,因为之前就下了jdk(里面包含jr ...

  7. Tensor基本操作

    Tensor(张量) 1.Tensor,又名张量,从工程角度来说,可简单地认为它就是一个数组,且支持高效的科学计算.它可以是一个数(标量).一维数组(向量).二维数组(矩阵)或更高维的数组(高阶数组) ...

  8. java内存结构

    Java的内存结构 JVM的内存结构主要有三大块:堆.方法区和栈.堆内存是JVM中最大的一块,由年轻代和老年代组成,而年轻代内存又被分为三部分,Eden空间.FromSurvivor空间和ToSurv ...

  9. react.JS基础

    1.ReactDOM.render() React.render 是 React 的最基本方法,用于将模板转为 HTML 语言,并插入指定的 DOM 节点. <!DOCTYPE html> ...

  10. Round #2

    题源:来自hzwer整理的题 2014-5-10 NOIP模拟赛 by coolyangzc Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模 ...