Solr7服務搭建及簡單使用

前言

最近在搭一套微服務環境,其中“帖子模塊”需要用到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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章