版权声明:转载请注明原始链接 https://blog.csdn.net/sswqzx/article/details/84501241
一、SolrJ概述
1、概述
SolrJ是Apache官方提供的一套Java开发的,访问Solr服务的API,
通过这套API可以让我们的程序与Solr服务产生交互,让我们的程序可以实现对Solr索引库的增删改查!
2、依赖
<dependencies>
<!-- solrj api -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.2</version>
</dependency>
<!-- solrj底层用到slf4j日志工具 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.22</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- Junit单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
二、SolrJ添加或修改索引库数据
1、以Document形式添加或修改索引库数据
package com.solr.Test;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
/**
* @ Author :ShaoWei Sun.
* @ Date :Created in 11:03 2018/11/25
*/
public class Create_Solr_Document {
/**
* 以Document形式向solr添加或修改数据
*/
@Test
public void testCreateIndex() throws Exception{
//1、连接服务器
SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
//2、创建solr的输入document
SolrInputDocument document = new SolrInputDocument();
//3、添加字段
document.addField("id","17386");
document.addField("title","保时捷、一代神车" );
document.addField("price", 199999999);
//4、添加document到server
server.add(document);
//5、提交请求、如果id不存在就创建数据、如果存在则修改数据
server.commit();
}
}
2、使用注解和JavaBean添加或修改索引库数据
package com.solr.Test;
import com.solr.domain.Item;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.junit.Test;
/**
* @ Author :ShaoWei Sun.
* @ Date :Created in 11:10 2018/11/25
*/
public class Create_Solr_JavaBean {
/**
* 以JavaBean形式向solr添加或修改数据
*/
@Test
public void testCreateIndexBean() throws Exception{
//1、连接solr服务器
SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
//2、创建一个实体类对象
Item item = new Item();
item.setId("17386");
item.setTitle("oppe手机、好用");
item.setPrice(2999);
//3、将对象添加到server
server.addBean(item);
//4、提交请求、如果id不存在则添加新数据、如果已存在则修改数据
server.commit();
}
}
JavaBean类Item.java
package com.solr.domain;
import org.apache.solr.client.solrj.beans.Field;
import java.io.Serializable;
/**
* @ Author :ShaoWei Sun.
* @ Date :Created in 11:20 2018/11/25
*/
public class Item implements Serializable {
private static final long SerialVersionUID = 1L;
@Field("id")
private String id;
@Field("title")
private String title;
@Field("price")
private flaot price;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public flaot getPrice() {
return price;
}
public void setPrice(flaot price) {
this.price = price;
}
@Override
public String toString() {
return "Item{" +
"id='" + id + '\'' +
", title='" + title + '\'' +
", price=" + price +
'}';
}
}
三、SolrJ删除索引库数据
package com.solr.Test;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.junit.Test;
/**
* @ Author :ShaoWei Sun.
* @ Date :Created in 11:30 2018/11/25
*/
public class Delete_Solr {
/**
* 根据id删除索引
*/
@Test
public void testDeleteIndexById() throws Exception{
//1、连接solr服务器
SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
//2、根据id删除索引
server.deleteById("17386");
server.commit();
}
/**
* 根据title删除索引
* @throws Exception
*/
@Test
public void testDeleteIndexByQuery() throws Exception{
//1、连接solr服务器
SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
//2、根据查询条件删除索引
server.deleteByQuery("title:iphone");
//3、提交
server.commit();
}
}
四、SolrJ查询索引库数据
1、以Document形式返回查询结果
/**
* 演示:使用SolrJ查询索引,返回的是Document形式
* @throws Exception
*/
@Test
public void testQueryDocument() throws Exception{
//1、连接solr服务器
SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
//2、创建查询对象:SolrQuery
SolrQuery query = new SolrQuery("title:apple");
//3、执行查询、获取响应
QueryResponse response = server.query(query);
//4、获取查询结果、本质就是一个document的集合
SolrDocumentList results = response.getResults();
//5、获取总条数
System.out.println("总条数:"+results.size());
//6、遍历集合
for (SolrDocument result : results) {
System.out.println("id:"+result.getFieldValue("id"));
System.out.println("title:"+result.getFieldValue("title"));
System.out.println("price:"+result.getFieldValue("price"));
}
}
2、以JavaBean形式返回查询结果
/**
* 演示:使用SolrJ查询索引,返回的是JavaBean
* @throws Exception
*/
@Test
public void testQueryBeans() throws Exception{
//1、连接Solr服务器
SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
//2、创建查询对象:solrQuery
SolrQuery query = new SolrQuery("title:apple");
//3、执行查询、获取响应
QueryResponse response = server.query(query);
//4、获取查询结果、指定实体类的类型、返回实体类的集合
List<Item> list = response.getBeans(Item.class);
//5、打印总条数
System.out.println("总条数:"+list.size());
//6、遍历
for (Item item : list) {
System.out.println(item.getId());
System.out.println(item.getTitle());
System.out.println(item.getPrice());
}
}
3、SolrQuery对象的高级查询
1、通配符查询:
匹配所有文档:*:*
(通配符 ?和* “*” 表示匹配任意字符; “?” 表示匹配任意一个字符)
2、布尔操作:AND、OR和NOT布尔操作(推荐使用大写,区分普通字段)
3、子布尔查询(子查询):可以使用“()”构造子查询。 比如:(query1 AND query2) OR (query3 AND query4)
4、相似度查询:
(1)默认相似度查询:title:appla~ ,此时编辑举例是2
(2)指定编辑举例的相似度查询:对模糊查询可以设置编辑举例,可选0~2的整数。title:appla~1
5、范围查询(Range Query):Lucene支持对数字、日期甚至文本的范围查询。结束的范围可以使用 “*” 通配符。
(1)日期范围(ISO-8601 时间GMT):a_begin_date:[1990-01-01T00:00:00Z TO 1999-12-31T24:59:99Z]
(2)数字:salary:[2000 TO *]
(3)文本:entryNm:[a TO a]
6、日期匹配:YEAR, MONTH, DAY, DATE (synonymous with DAY) HOUR, MINUTE,
SECOND, MILLISECOND, and MILLI (synonymous with MILLISECOND)可以被标志成日期。
(1)r_event_date:[* TO NOW-2YEAR]:2年前的现在这个时间
(2)r_event_date:[* TO NOW/DAY-2YEAR]:2年前前一天的这个时间
3.1、布尔查询:
/**
* 布尔查询:
* @throws Exception
*/
@Test
public void testBooleanSolr() throws Exception{
//1、连接solr服务器
SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
//2、创建查询对象
SolrQuery solrQuery = new SolrQuery("title:apple OR title:iphoe");
//3、执行查询、获取响应
QueryResponse queryResponse = server.query(solrQuery);
//4、获取查询结果、指定实体类的类型、返回实体类的集合
List<Item> list = queryResponse.getBeans(Item.class);
//5、打印总条数
System.out.println("总条数:"+list.size());
//6、遍历
for (Item item : list) {
System.out.println(item.getId());
System.out.println(item.getTitle());
System.out.println(item.getPrice());
}
}
3.2、相似度查询:
//相似度查询:
@Test
public void testBooleanSolrLike() throws Exception{
//1、连接solr服务器
SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
//2、创建查询对象
SolrQuery solrQuery = new SolrQuery("title:奔*");
//3、执行查询、获取响应
QueryResponse queryResponse = server.query(solrQuery);
//4、获取查询结果、指定实体类的类型、返回实体类的集合
List<Item> list = queryResponse.getBeans(Item.class);
//5、打印总条数
System.out.println("总条数:"+list.size());
//6、遍历
for (Item item : list) {
System.out.println(item.getId());
System.out.println(item.getTitle());
System.out.println(item.getPrice());
}
}
3.3、范围查询
//范围查询:
@Test
public void testBooleanSolrrange() throws Exception{
//1、连接solr服务器
SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
//2、创建查询对象
SolrQuery solrQuery = new SolrQuery("price:[300 TO 4000]");
//3、执行查询、获取响应
QueryResponse queryResponse = server.query(solrQuery);
//4、获取查询结果、指定实体类的类型、返回实体类的集合
List<Item> list = queryResponse.getBeans(Item.class);
//5、打印总条数
System.out.println("总条数:"+list.size());
//6、遍历
for (Item item : list) {
System.out.println(item.getId());
System.out.println(item.getTitle());
System.out.println(item.getPrice());
}
}
4、SolrQuery实现排序
//SolrQuery实现排序
@Test
public void testSolrQuerySort() throws Exception{
//1、连接solr服务器
SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
//2、创建查询对象SolrQuery
SolrQuery query = new SolrQuery("title:apple,ooooooo");
//3、设置查询的排序参数
query.setSort("price", SolrQuery.ORDER.desc);//价格降序
//4、执行查询获取响应
QueryResponse response = server.query(query);
//5、获取查询结果、指定实体类的类型、返回实体类的集合
List<Item> list = response.getBeans(Item.class);
//打印总条数
System.out.println("共有:"+list.size());
//6、遍历
for (Item item : list) {
System.out.println(item.getId());
System.out.println(item.getTitle());
System.out.println(item.getPrice());
}
}
5、SolrQuery实现分页
//SolrQuery实现分页
@Test
public void testPageQuery() throws Exception{
//1、准备分页
int pageNum = 2;//要查询页数
int pageSize = 2;//每页显示条数
int start = (pageNum-1)*pageSize;//当前页的起始条数
SolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
SolrQuery query = new SolrQuery("title:apple");
query.setSort("id", SolrQuery.ORDER.asc);
query.setStart(start);
query.setRows(2);
QueryResponse response = server.query(query);
List<Item> list = response.getBeans(Item.class);
System.out.println("当前第" + pageNum + "页,本页共" + list.size() + "条数据。");
for (Item item : list) {
System.out.println(item.getId());
System.out.println(item.getTitle());
System.out.println(item.getPrice());
}
}
6、SolrQuery实现高亮显示
//SolrQuery实现高亮显示
@Test
public void testHighlightingQuery() throws Exception {
// 连接Solr服务器,需要指定地址:我们可以直接从浏览器复制地址。要删除#
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/collection1");
// 创建查询对象
SolrQuery query = new SolrQuery("title:apple");
// 设置高亮的标签
query.setHighlightSimplePre("<font color = 'red'>");
query.setHighlightSimplePost("</font>");
// 高亮字段
query.addHighlightField("title");
// 查询
QueryResponse response = server.query(query);
// 解析高亮响应结果,是一个Map
// 外层的Map:它的键是文档的id,值是这个文档的其它高亮字段,又是一个Map
// 内存的Map:是其它高亮字段,键是其它字段的名称,值是这个字段的值,这个值是一个List
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
// 获取非高亮结果
List<Item> list = response.getBeans(Item.class);
for (Item item : list) {
String id = item.getId();
System.out.println("id: " + id);
// 这里ID是long类型,与集合的键不匹配,所以我们需要把id转为String类型,再get
System.out.println("title: " + highlighting.get(id+"").get("title").get(0));
System.out.println("price: " + item.getPrice());
}
}