springboot整合solr的方法詳解
這一篇寫一下springboot整合solr,代碼已經(jīng)上傳到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"/>
配置完畢后啟動(dòng)solr。
2、相關(guān)配置
配置maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
配置application.properties相關(guān)solr的內(nèi)容
# solr配置 spring.data.solr.host=http://localhost:8983/solr/book_core
如果想同時(shí)使用好幾個(gè)core,通過(guò)HttpSolrClient solrClient = new HttpSolrClient(url);構(gòu)造出對(duì)應(yīng)core的solrClient進(jìn)行相關(guān)操作。
3、solr增刪改查
3.1、新增實(shí)體
@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;
}
}
在這里要說(shuō)明一下 實(shí)體類上的注解@field和@SolrDocument 是為了QueryResponse.getBeans()能轉(zhuǎn)化成相關(guān)實(shí)體類,不然無(wú)法識(shí)別。
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;
}
增加刪除修改都差不多,增加和修改可以通過(guò)add(SolrInputDocument)和addBean,根據(jù)主鍵是否存在來(lái)判斷是新增還是修改,刪除可以通過(guò)主鍵或者條件進(jìn)行刪除。增刪改之后一定要記得commit!
主鍵是在schema中配置的,默認(rèn)有 id字段做主鍵,也可以自定義主鍵,在schema中配置。
通過(guò)add方法加了幾個(gè)demo后,可以在solr管理頁(yè)面的查詢出查看添加的內(nèi)容

3.3查詢
查詢則通過(guò)SolrQuery入?yún)⑦M(jìn)行查詢
@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;
同時(shí)我寫了一個(gè)jsp頁(yè)面來(lái)展示查詢結(jié)果。

到此,增刪改查的基本操作都已經(jīng)實(shí)現(xiàn)了,更多高級(jí)用法可以參考官方api文檔。
4、高亮
一開(kāi)始在嘗試使用高亮?xí)r發(fā)現(xiàn)無(wú)法起作用,排查后發(fā)現(xiàn)高亮是在QueryResponse中的另一個(gè)結(jié)果集的。
QueryResponse.getHighlighting()
取出來(lái)的字段值為自定義前綴后綴拼接具體字段值。
@Override
public List<Book> query(String query) {
List<Book> bookList = new ArrayList<Book>();
SolrQuery solrQuery = new SolrQuery();
//設(shè)置默認(rèn)搜索的域
solrQuery.set("df", "description");
solrQuery.setQuery(query);
//高亮顯示
solrQuery.setHighlight(true);
//設(shè)置高亮顯示的域
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;
}
頁(yè)面展示如下:

搜索框分詞之后,搜索出來(lái)的帶有高亮的值。
增刪改查最基本的應(yīng)用就差不多了,更高級(jí)的代碼請(qǐng)查看官方api文檔。上文中所有代碼都上傳至github,傳送門。
- 解決springboot報(bào)錯(cuò)Could not resolve placeholder‘xxx‘ in value“${XXXX}
- SpringBoot整合Solr實(shí)現(xiàn)文檔檢索
- IDEA SpringBoot:Cannot resolve configuration property配置文件問(wèn)題
- SpringBoot測(cè)試時(shí)卡在Resolving Maven dependencies的問(wèn)題
- springboot 自定義LocaleResolver實(shí)現(xiàn)切換語(yǔ)言
- SpringBoot集成SOL鏈的詳細(xì)過(guò)程
相關(guān)文章
Java Web中解決路徑(絕對(duì)路徑與相對(duì)路徑)問(wèn)題
這篇文章主要介紹了Java Web中解決路徑問(wèn)題的相關(guān)資料,java 文件路徑有絕對(duì)路徑與相對(duì)路徑,這里提供了幾種方法解決所有路徑問(wèn)題,需要的朋友可以參考下2017-01-01
關(guān)于訪問(wèn)后端接口報(bào)404錯(cuò)誤問(wèn)題的解決方法(全網(wǎng)最細(xì)!)
404頁(yè)面的出現(xiàn)會(huì)降低用戶體驗(yàn),那么導(dǎo)致404頁(yè)面出現(xiàn)的原因是什么呢?這篇文章主要給大家介紹了關(guān)于訪問(wèn)后端接口報(bào)404錯(cuò)誤問(wèn)題的解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
使用SpringAOP實(shí)現(xiàn)公共字段填充功能
在新增員工或者新增菜品分類時(shí)需要設(shè)置創(chuàng)建時(shí)間、創(chuàng)建人、修改時(shí)間、修改人等字段,在編輯員工或者編輯菜品分類時(shí)需要設(shè)置修改時(shí)間、修改人等字段,這些字段屬于公共字段,本文將給大家介紹使用SpringAOP實(shí)現(xiàn)公共字段填充功能,需要的朋友可以參考下2024-08-08
Spring Boot日志技術(shù)logback原理及配置解析
這篇文章主要介紹了Spring Boot日志技術(shù)logback原理及用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
基于rocketmq的有序消費(fèi)模式和并發(fā)消費(fèi)模式的區(qū)別說(shuō)明
這篇文章主要介紹了基于rocketmq的有序消費(fèi)模式和并發(fā)消費(fèi)模式的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
java讀取word文檔,提取標(biāo)題和內(nèi)容的實(shí)例
這篇文章主要介紹了java讀取word文檔,提取標(biāo)題和內(nèi)容的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10

