前言
最近在搭一套微服務環境,其中“帖子模塊”需要用到Solr的全文檢索和高亮查詢,服務搭建完畢後決定將Solr的服務搭建過程和查詢簡單記錄一下。
之前用Lucene實現過類似的功能,Solr也是基於Lucene的,但Solr是面向企業級的搜索服務,功能更強大。
服務搭建
下載軟件
前往Solr官網下載,下載鏈接。
解壓並啓動
現在Solr已經內置了容器,可以單獨運行,無需依賴Tomcat。
./bin/solr start
訪問8983端口
http://localhost:8983
看到如下頁面表示Solr啓動成功。
到這裏基本的Solr服務就算搭建完畢了,還是非常簡單的。
新建Core
Solr支持多Core,可以把Core看成是MySQL中的一個數據庫,它是Solr的索引庫,存放着索引數據。
可以在頁面上新建,也可以使用如下命令創建:
./bin/solr create -c newCore
新建完Core後,頁面上會顯示,可以對Core數據做一些增刪改查的操作。
中文分詞器
Solr內置了很多分詞器,雖然也有支持中文的,但是分詞效果不是很好。
可以安裝其他分詞器,用的比較多的就是IK分詞器了。
IK分詞器下載
https://search.maven.org/search?q=g:com.github.magese
拷貝到以下目錄
solr/server/solr-webapp/webapp/WEB-INF/lib
修改配置文件
server/solr/newCore/conf/managed-schema
<!-- IK中文分詞器 -->
<fieldType name="text_ik" 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>
重啓Solr,查看分詞效果
./bin/solr restart
SpringBoot整合
導入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
配置文件指明Solr服務地址
spring:
data:
solr:
host: http://localhost:8983/solr/douban
創建需要保存到Solr的實體類
@SolrDocument(solrCoreName = "douban")
@Data
public class PostSolr {
@Field
private String postId;
@Field
private String postText;
@Field
private String postImg;
@Field
private String headImg;
@Field
private String nickName;
@Field
private String remarks;
@Field
private Date createTime;
@Field
private String postTypeText;
@Field
private Integer likeNum;
@Field
private Integer commentNum;
}
Solr配置文件中配置域
server/solr/newCore/conf/managed-schema
<field name="postId" type="string" multiValued="false"/>
<field name="postText" type="text_ik" indexed="true" stored="true" multiValued="false"/>
<field name="postImg" type="string"/>
<field name="headImg" type="string"/>
<field name="nickName" type="string"/>
<field name="remarks" type="string"/>
<field name="createTime" type="pdate"/>
<field name="postTypeText" type="string"/>
<field name="likeNum" type="pint"/>
<field name="commentNum" type="pint"/>
<uniqueKey>postId</uniqueKey>
具體的域配置可以查閱相關資料。
注入SolrClient
與Solr的交互通過SolrClient來進行。
@Autowired
private SolrClient solrClient;
新增文檔
裝配好PostSolr對象,addBean即可。
solrClient.addBean(postSolr);
查詢
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery("postText:" + "興趣");
QueryResponse query = solrClient.query(solrQuery);
List<PostSolr> beans = query.getBeans(PostSolr.class);
solrClient.close();
高亮查詢
高亮查詢可以使得查詢到的關鍵字高亮顯示,類似百度的效果。
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery("postText:" + "關鍵字");
//默認查詢的域
solrQuery.set("df","postText");
//開啓高亮
solrQuery.set("hl",true);
//高亮的域
solrQuery.set("h1.fl", "postText");
//前綴、後綴 加粗且標紅
solrQuery.set("hl.simple.pre", "<b style='color:red'>");
solrQuery.set("hl.simple.post", "</b>");
QueryResponse query = solrClient.query(solrQuery);
Map<String, Map<String, List<String>>> highlighting = query.getHighlighting();
List<PostSolr> beans = query.getBeans(PostSolr.class);
for (PostSolr bean : beans) {
bean.setPostText(highlighting.get(bean.getPostId()).get("postText").get(0));
}
solrClient.close();
刪除
根據條件刪除文檔。
solrClient.deleteByQuery("postId:bf582adafa5f47469914db35f22c9225");
solrClient.commit();
solrClient.close();