springboot整合solr的方法详解
作者:Leon_W 发布时间:2023-01-20 17:54:37
这一篇写一下springboot整合solr,代码已经上传到github,传送门。
1、新建core并配置schema
solr create -c "book_core" ,配置分词器并且field类型定义为分词器类型。
<fieldType name="ik_word" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<!-- 自定义添加filed -->
<field name="description" type="ik_word" indexed="true" stored="true"/>
配置完毕后启动solr。
2、相关配置
配置maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
配置application.properties相关solr的内容
# solr配置
spring.data.solr.host=http://localhost:8983/solr/book_core
如果想同时使用好几个core,通过HttpSolrClient solrClient = new HttpSolrClient(url);构造出对应core的solrClient进行相关操作。
3、solr增删改查
3.1、新增实体
@SolrDocument(solrCoreName = "book_core")
public class Book {
@Id
@Field
private String id;
@Field
private String description;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
在这里要说明一下 实体类上的注解@field和@SolrDocument 是为了QueryResponse.getBeans()能转化成相关实体类,不然无法识别。
3.2增删改
@Autowired
SolrClient solrClient;
@Override
public void add(Book book) {
SolrInputDocument document = new SolrInputDocument();
document.setField("id",book.getId());
document.setField("description",book.getDescription());
try {
solrClient.add(document);
solrClient.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void delete(String query) {
try {
solrClient.deleteByQuery(query);
solrClient.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public Book update(Book book) {
try {
solrClient.addBean(book);
solrClient.commit();
} catch (IOException e) {
e.printStackTrace();
} catch (SolrServerException e) {
e.printStackTrace();
}
return book;
}
增加删除修改都差不多,增加和修改可以通过add(SolrInputDocument)和addBean,根据主键是否存在来判断是新增还是修改,删除可以通过主键或者条件进行删除。增删改之后一定要记得commit!
主键是在schema中配置的,默认有 id字段做主键,也可以自定义主键,在schema中配置。
通过add方法加了几个demo后,可以在solr管理页面的查询出查看添加的内容
3.3查询
查询则通过SolrQuery入参进行查询
@Override
public List<Book> queryAll() {
List<Book> bookList = new ArrayList<Book>();
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery("*:*");
try {
QueryResponse queryResponse = solrClient.query(solrQuery);
if (queryResponse != null){
bookList = queryResponse.getBeans(Book.class);
}
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bookList;
同时我写了一个jsp页面来展示查询结果。
到此,增删改查的基本操作都已经实现了,更多高级用法可以参考官方api文档。
4、高亮
一开始在尝试使用高亮时发现无法起作用,排查后发现高亮是在QueryResponse中的另一个结果集的。
QueryResponse.getHighlighting()
取出来的字段值为自定义前缀后缀拼接具体字段值。
@Override
public List<Book> query(String query) {
List<Book> bookList = new ArrayList<Book>();
SolrQuery solrQuery = new SolrQuery();
//设置默认搜索的域
solrQuery.set("df", "description");
solrQuery.setQuery(query);
//高亮显示
solrQuery.setHighlight(true);
//设置高亮显示的域
solrQuery.addHighlightField("description");
//高亮显示前缀
solrQuery.setHighlightSimplePre("<font color='red'>");
//后缀
solrQuery.setHighlightSimplePost("</font>");
try {
QueryResponse queryResponse = solrClient.query(solrQuery);
if (queryResponse == null){
return null;
}
SolrDocumentList solrDocumentList = queryResponse.getResults();
if (solrDocumentList.isEmpty()){
return null;
}
//获取高亮
Map<String, Map<String, List<String>>> map = queryResponse.getHighlighting();
for (SolrDocument solrDocument : solrDocumentList){
Book book;
List<String> list = map.get(solrDocument.get("id")).get("description");
if (!CollectionUtils.isEmpty(list)){
solrDocument.setField("description",list.get(0));
}
String bookStr = JSONUtil.toJSON(solrDocument);
book = JSON.parseObject(bookStr,Book.class);
bookList.add(book);
}
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bookList;
}
页面展示如下:
搜索框分词之后,搜索出来的带有高亮的值。
增删改查最基本的应用就差不多了,更高级的代码请查看官方api文档。上文中所有代码都上传至github,传送门。
来源:https://www.cnblogs.com/wdfordream/p/11377161.html


猜你喜欢
- 本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用。具体如下:大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件
- 1.Action中的validate()方法Struts2提供了一个Validateable接口,这个接口中只存在validat
- 一、创建maven项目我使用的是汉化的idea可以选择原型,我这里没有选择输入项目名称,完成创建二、配置tomcat选择运行编辑配置点加号找
- 参考:How to catch an Exception from a threadIs there a way to make Runna
- 示例代码:<%@ Page Language="C#" AutoEventWireup="true&qu
- C#的timer与线程使用卡顿怎么处理,多线程。多线程比timer好读。看看timer和线程的关系。timer有3种1.winform 下的
- 引言float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近
- C# 获取某个时间的0点0分和23点59分59秒,具体代码如下所示:C#获取当月第一天和最后一天当月第一天0时0分0秒:DateTime.N
- 为什么需要在应用程序中增加渠道信息?Android应用的发布需要面对各种各样的市场,我们称之为渠道。有的时候,我们需要知道应用是从哪个渠道下
- Settings -> Editor -> General -> Use soft wraps in editor&nbs
- 1.注解方式,yml文件配置上以下就可以直接使用mybatis-plus: mapper-locations: classpath:mapp
- yaml介绍YAML(YAML Ain't Markup Language),一种数据序列化格式优点:容易阅读容易与脚本语言交互以数
- Java 使用IO流实现大文件的分割与合并文件分割应该算一个比较实用的功能,举例子说明吧比如说:你有一个3G的文件要从一台电脑Copy到另一
- 前言RecyclerView是我们常用的列表控件,一般来说当Item的数据改变的时候我们需要刷新当前的Item 。如何刷新 RV 的列表?基
- spring与IoCIoC:控制反转,将由代码操纵的对象控制权,交给第三方容器,反转给第三方容器。这种对象依赖的关系管理方式,称作IoC。I
- 可能开发安卓的人大多数都用过很多下拉刷新的开源组件,但是今天用了官方v4支持包的SwipeRefreshLayout觉得效果也蛮不错的,特拿
- 本文实例讲述了Android ActionBar Item用法。分享给大家供大家参考,具体如下:这里主要讲述ActionBar Item的使
- springboot项目部署平时我们在部署springboot打成jar方式部署得时候,大多数都会编写启动脚本,脚本有很多种写法,但大多数意
- Purpose开发人员在合作的时候经常遇到以下场景:1.开发人员A在自己的本地数据库做了一些表结构的改动,并根据这些改动调整了DAO层的代码
- 在Maven工程里运行Java main方法mvn compilemvn exec:java -Dexec.mainClass="