微服务集成cas_Spring Boot + Solr 全文检索微服务简易集成
點(diǎn)擊上方?Java后端,選擇?設(shè)為星標(biāo)
優(yōu)質(zhì)文章,及時(shí)送達(dá)
作者:JasonGofen
鏈接:https://www.jianshu.com/p/95869ade37b3
本文內(nèi)容主要講解Solr 7.7.1 環(huán)境搭建后使用Spring boot 2.1.3集成SolrJ實(shí)現(xiàn)簡(jiǎn)易全文檢索微服務(wù),對(duì)于Solr與Spring boot的介紹內(nèi)容網(wǎng)上資料很多,本文不再贅述。
關(guān)于本文內(nèi)容所涉及資源在最后會(huì)給大家統(tǒng)一都列出來(lái)。
一、環(huán)境說(shuō)明
Spring boot 結(jié)合 SolrJ 實(shí)現(xiàn)對(duì)Solr Server的訪問(wèn)是非常簡(jiǎn)單的,它們相互之間的關(guān)系如下圖所示。
主體實(shí)現(xiàn)是通過(guò)在Spring boot微服務(wù)中集成SolrJ,配置好Solr Server參數(shù),調(diào)用SolrJ中的CRUD API實(shí)現(xiàn)請(qǐng)求Solr Server端進(jìn)行添加、修改、刪除索引和查詢的操作。至于如何結(jié)合現(xiàn)有業(yè)務(wù)系統(tǒng),我們后面介紹。
圖1 簡(jiǎn)易環(huán)境說(shuō)明
下面以最簡(jiǎn)單快速的方式實(shí)現(xiàn)全文檢索基礎(chǔ)CRUD功能。
二、搭建Solr 7.7.1 Server端
因自己的電腦硬盤空間滿了沒(méi)裝Linux虛擬機(jī),就以Windows為例安裝Solr Server端了。其實(shí)總體而言兩個(gè)系統(tǒng)對(duì)Solr Server端的操作類似,各位看官舉一反三就好,就兩種系統(tǒng)部署Solr的不同下面也會(huì)做相應(yīng)的提及。
已配置好的Solr 7.7.1下載:
https://pan.baidu.com/s/11s18oJVKpEVc-AmZO1xkgA
我們首先來(lái)了解一下Solr的常見(jiàn)命令:
啟動(dòng):
./solr start
關(guān)閉:
./solr stop -all
重啟:
./solr restart
創(chuàng)建Core:
./solr create -c YourCoreName -d _default
刪除Core:
./solr delete -c YourCoreName
關(guān)于Solr更細(xì)致的內(nèi)容,大家可以參閱下方鏈接:
Solr 官網(wǎng)
https://lucene.apache.org/solr/
Solr API官方文檔
http://lucene.apache.org/solr/7_7_1/solr-solrj/index.html
Solr 中文文檔(譯版)
https://www.w3cschool.cn/solr_doc/solr_doc-t3642fkr.html
要想搭建Solr Server攏共分3步:
步驟1:部署Solr 7.7.1
步驟1-1:下載安裝JDK和Solr Server端
下載安裝JDK 8:JDK的安裝在這就不說(shuō)了,網(wǎng)上有很多資料。\
Java SE Development Kit 8 下載
下載Solr 7.7.1壓縮包:請(qǐng)注意Linux下載solr-7.7.1.tgz,Windows下載solr-7.7.1.zip\
http://archive.apache.org/dist/lucene/solr/
步驟1-2:解壓Solr-7.7.1壓縮包
Windows下解壓壓縮包到對(duì)應(yīng)的目錄,我的路徑是:
C:\myworking\solr-7.7.1
Linux下使用 tar 命令解壓Solr壓縮包:
tar zxvf solr-7.7.1.tgz -C /myworking
步驟1-3:進(jìn)入bin目錄運(yùn)行Solr
Windows與Linux操作solr的命令都是一樣的,但都需要進(jìn)入到Solr的bin目錄下,我的目錄是C:\myworking\solr-7.7.1\bin。linux的目錄使用cd命令進(jìn)入即可。
進(jìn)入的到bin目錄下執(zhí)行 啟動(dòng) 命令:
./solr start
啟動(dòng)完成后的控制臺(tái)截圖:
圖2 控制臺(tái)Solr啟動(dòng)完成圖
隨后我們?cè)L問(wèn)http://localhost:8983即能看到Solr Server端的Web頁(yè)面了
圖3 Solr Server端 Web首頁(yè)
步驟1-4:創(chuàng)建Core
Solr Core的創(chuàng)建有兩種方式,第一種是通過(guò)命令行的方式,第二種是在Solr Web 首頁(yè)中創(chuàng)建。
個(gè)人比較推薦第一種,原因有二,一是方便快捷在命令行一句話搞定,Ctrl+c Ctrl+v齊活兒,不用在頁(yè)面上點(diǎn)來(lái)點(diǎn)去還得敲文字,二是所在公司大牛在實(shí)踐過(guò)后說(shuō)是如果采用的第二種方式創(chuàng)建出的Core會(huì)有一些問(wèn)題。本著聽(tīng)人話,吃飽飯的態(tài)度就采用第一種吧~ ~*大家可以實(shí)踐一下然后分享給我哦。*當(dāng)然兩種方式還是要介紹下的。
使用命令行創(chuàng)建Core
我們只需要進(jìn)入到上述的bin目錄,復(fù)制以下命令即可創(chuàng)建Core,命令中的TestCore為名稱可以自行替換:
./solr create -c TestCore -d _default
使用Web端創(chuàng)建Core
上述圖3中左側(cè)的列表第3個(gè)Core Admin菜單項(xiàng),點(diǎn)開(kāi)后就明白怎么做了。
在Web端查看TestCore
圖4 選擇TestCore
圖5 TestCore詳情圖
步驟2:配置IK-Analyzer中文分詞
介紹性的內(nèi)容還是不羅列了,大家自己百度吧。Ik-Analyzer分詞據(jù)說(shuō)是國(guó)內(nèi)最好用的中文分詞,大部分人都用這個(gè)。目前Solr-7.7.1也自帶了一個(gè)中文分詞,具體的對(duì)比我沒(méi)做過(guò),等裝完IK后大家回來(lái)可以進(jìn)行下對(duì)比。同時(shí)歡迎分享給我哦。
IK分詞GitHub:
https://github.com/magese/ik-analyzer-solr7
動(dòng)態(tài)詞庫(kù)自動(dòng)加載:
https://github.com/liang68/ik-analyzer-solr6
http://www.cnblogs.com/liang1101/articles/6395016.html
PS:關(guān)于動(dòng)態(tài)詞庫(kù)自動(dòng)加載,這個(gè)大家看一下下面這段引用描述后視項(xiàng)目情況選擇要不要去研究下。
如果只是在我們?cè)械臉I(yè)務(wù)系統(tǒng)中簡(jiǎn)單集成Solr,那暫時(shí)沒(méi)必要去了解動(dòng)態(tài)詞庫(kù)自動(dòng)加載。如果像商城等業(yè)務(wù)系統(tǒng)中,對(duì)于搜索模塊是業(yè)務(wù)系統(tǒng)的核心之一,那么簡(jiǎn)單使用IK可能無(wú)法達(dá)到線上使用的要求。在IK分詞器中默認(rèn)是一次啟動(dòng)將主詞庫(kù)、停用詞以及擴(kuò)展詞庫(kù)全部加載完畢,后續(xù)如果再想要增加額外的擴(kuò)展詞,就必須得修改對(duì)應(yīng)的擴(kuò)展詞表重新打包上傳并重啟服務(wù)方能生效,這種方式不適合應(yīng)用與線上服務(wù)。那么到底如何實(shí)現(xiàn)這種無(wú)縫擴(kuò)充詞庫(kù)呢?大家可以看看上面的博客。
步驟2-1:配置IK-analyzer jar包和詞庫(kù)
首先需要大家下載jar包和源碼,我們下面需要放到Solr Server端對(duì)應(yīng)的目錄下。
IK分詞jar包:
https://search.maven.org/remotecontent?filepath=com/github/magese/ik-analyzer/7.7.1/ik-analyzer-7.7.1.jar
IK分詞GitHub源碼:
https://github.com/magese/ik-analyzer-solr7
將下載好的ik-analyzer-7.7.1.jar包放入Solr服務(wù)的 webapp\WEB-INF\lib目錄下,我的目錄全路徑是:
C:\myworking\solr-7.7.1\server\solr-webapp\webapp\WEB-INF\lib
將下載好的ik-analyzer-solr7-master源碼下的src\main\resources目錄中的文件***(如下)***,放入到webapp\WEB-INF\classes目錄下:
① IKAnalyzer.cfg.xml 擴(kuò)展配置文件
② ext.dic 擴(kuò)展詞庫(kù)
③ stopword.dic 停止詞庫(kù)
④ ik.conf 動(dòng)態(tài)詞庫(kù)配置文件
⑤ dynamicdic.txt 動(dòng)態(tài)詞庫(kù)
我的目錄全路徑是:
C:\myworking\solr-7.7.1\server\solr-webapp\webapp\WEB-INF\classses
關(guān)于詞庫(kù)中同義詞庫(kù)、擴(kuò)展詞庫(kù)、停止詞庫(kù)的介紹,可以看下面的blog:
https://blog.csdn.net/zcl_love_wx/article/details/52092894
步驟2-2. 配置TestCore的server\solr\TestCore\conf\managed-schema,添加IK分詞器,示例如下:
*PS:放在標(biāo)簽下。*同時(shí)在該標(biāo)簽下我們還需要配置field,請(qǐng)看步驟3。
步驟3:配置field
Solr filed域的配置極為重要,filed的配置會(huì)影響到索引的創(chuàng)建和查詢出的結(jié)果展示。
name:查詢時(shí)的名稱
type:這個(gè)是之前定義的FieldType的名稱,在這使用的ik分詞
indexed:是否索引(true/false)
stored:是否存儲(chǔ)(是否將索引結(jié)果存儲(chǔ)到索引庫(kù))
multivalued:是否多值(一般配合copyField使用)
動(dòng)態(tài)filed
在定義filed時(shí),可能會(huì)隨著業(yè)務(wù)主線作出變更,那么每次在managed-schema更改filed后,還需重啟Solr也是個(gè)麻煩事兒。那么在生產(chǎn)環(huán)境如此操作可能顯得不是那么理想了。那么可以在變更時(shí)使用類似通配符的方式建立動(dòng)態(tài)filed,比如name="title"可以寫成name="fl_*",這樣只要以fl_開(kāi)頭的索引都可以被建立。
步驟4:重啟Solr服務(wù),測(cè)試ik分詞
這里請(qǐng)注意Analyse Fieldname / FieldType:右邊的下拉列表,需要去選中ik分詞text_ik。我們可以看到輸入中華人民共和國(guó)關(guān)鍵字后所出現(xiàn)的分詞效果。
圖6 分詞效果圖
至此我們的Solr Server端基礎(chǔ)版就搭建完成了,下面開(kāi)始使用Spring boot結(jié)合SolrJ進(jìn)行全文檢索微服務(wù)的搭建。
三、Spring boot 微服務(wù)實(shí)現(xiàn)
Spring boot的基礎(chǔ)知識(shí)不講解了,下面我們采用Spring boot 2.1.3結(jié)合SolrJ 7.7.1完成全文檢索微服務(wù)的實(shí)現(xiàn)。
下載源碼
https://github.com/JasonGofen/SolrProject
步驟1:在本地準(zhǔn)備將要建立索引的文件
準(zhǔn)備兩個(gè)doc文檔,寫入一些自定內(nèi)容,放到指定目錄下,當(dāng)然也不一定非得要doc。以下是我準(zhǔn)備的兩個(gè)文件:
C:\solrfile\data\鵝鵝鵝.pdf
C:\solrfile\data\靜夜思.docx
步驟2:搭建Spring boot項(xiàng)目
創(chuàng)建項(xiàng)目,在pom.xml引入SolrJ的Maven依賴
org.apache.solrsolr-solrj7.7.1org.apache.tikatika-core1.9
目錄結(jié)構(gòu)
├── src
│ └── main
│ ├── java
│ │ └── com.jasongofen
│ │ ├── client
│ │ │ └── SolrClient.java // Solr客戶端
│ │ ├── config
│ │ │ ├── CorsConfig.java // 跨域配置文件
│ │ │ └── SolrConfigProperties.java // yml屬性實(shí)例化配置文件
│ │ ├── test
│ │ │ └── SolrCURDTest.java // Solr API調(diào)用測(cè)試示例
│ │ ├── util
│ │ │ ├── ConvertUtil.java // 自定義轉(zhuǎn)換工具類
│ │ │ └── TikaUtil.java // 提取文檔內(nèi)容工具類
│ │ └── SolrProjectApplication.java // Spring boot啟動(dòng)類
│ └── resources
│ ├── application.yml // 項(xiàng)目配置
│ ├── banner.txt // banner配置
│ └── logback-spring.xml // 日志配置
├── pom.xml // 依賴配置
└── README.md // 項(xiàng)目幫助文檔
配置application.yml中solr節(jié)點(diǎn)下的屬性值***(必須)***
# solr配置
solr:
# Solr Server端地址
server: localhost:8983 # 設(shè)置你的Solr Server訪問(wèn)地址
# Solr Core名稱
core: TestCore # 設(shè)置你的Solr Core名稱
# 上面準(zhǔn)備的文檔的所在本地路徑
dir: C:\solrfile\data\ # 設(shè)置你的需要建立索引的文件所在目錄
步驟3:運(yùn)行項(xiàng)目
下面就可以運(yùn)行項(xiàng)目了,SolrJ API調(diào)用請(qǐng)看以下內(nèi)容。
未完待續(xù)
SolrJ API調(diào)用說(shuō)明
基礎(chǔ)的API調(diào)用代碼在項(xiàng)目目錄src\main\java\com.jasongofen.test\SolrCURDTest.java文件中,該java是一個(gè)Controller可以以http請(qǐng)求的方式模擬其他業(yè)務(wù)系統(tǒng)調(diào)用過(guò)程。
添加、修改索引
添加索引時(shí)首先使用HttpSolrClient與Solr Server建立連接,隨后解析需要建立索引的文件*(至于需要結(jié)合現(xiàn)有的業(yè)務(wù)系統(tǒng)是采用http ftp等方式從各自的文件Server中獲取,還是另外的方式,請(qǐng)結(jié)合當(dāng)前項(xiàng)目業(yè)務(wù)需要作擴(kuò)展即可)*,接著把解析出的文件數(shù)據(jù)放到對(duì)應(yīng)的索引位置,在設(shè)置索引內(nèi)容時(shí)id字段是必須要設(shè)置的且全局唯一,最后提交索引并關(guān)閉SolrClient。
修改索引時(shí),如果id在索引庫(kù)中已存在,則執(zhí)行更新操作。
@GetMapping("/Add")
public void solrAdd() throws Exception {
// 設(shè)置文件路徑
List files = new ArrayList<>();
files.add("鵝鵝鵝.pdf");
files.add("靜夜思.docx");
// 獲取Solr客戶端
HttpSolrClient solr = SolrClient.getClient(solrConfigProperties.getServer());
String prefix = "";
for (String fi : files) {
System.out.println(fi);
// 取后綴名
prefix = ConvertUtil.getFileSufix(fi);
if (prefix.equalsIgnoreCase("txt") ||
prefix.equalsIgnoreCase("docx") ||
prefix.equalsIgnoreCase("doc") ||
prefix.equalsIgnoreCase("pdf")) {
String[] fileInfo = fi.split("\\.");
String content = "";
// 獲取文件流,取出文件內(nèi)容
InputStream inputStream = new FileInputStream(solrConfigProperties.getDir() + fi);
if (prefix.equals("txt")) {
content = TikaUtil.txt2String(inputStream);
} else if (prefix.equals("docx") || prefix.equals("doc") || prefix.equals("pdf")) {
content = TikaUtil.doc2String(inputStream);
} else {
inputStream.close();
}
// 添加索引
SolrInputDocument solrDoc = new SolrInputDocument();
String formatDate = ConvertUtil.formatDate();
// 執(zhí)行添加 ps:如果id相同,則執(zhí)行更新操作
solrDoc.addField("id", UUID.randomUUID().toString().toUpperCase().replace("-", ""));
solrDoc.addField("title", fileInfo[0]);
solrDoc.addField("content", content);
solrDoc.addField("filetype", prefix);
solrDoc.addField("uploadtime", formatDate);
solr.add(solrConfigProperties.getCore(), solrDoc);
} else {
continue;
}
}
// 提交
solr.commit(solrConfigProperties.getCore());
solr.close();
}
查詢
查詢時(shí)因返回的是JSON串,并未做前端頁(yè)面展示,請(qǐng)根據(jù)業(yè)務(wù)需求自行定制。
@GetMapping("/Query")
public SolrDocumentList solrQuery() throws Exception {
HttpSolrClient solrClient = SolrClient.getClient(solrConfigProperties.getServer());
// 定義查詢條件
Map params = new HashMap();
params.put("q", "*:*");
SolrParams mapSolrParams = new MapSolrParams(params);
//執(zhí)行查詢 第一個(gè)參數(shù)是collection,就是我們?cè)趕olr中創(chuàng)建的core
QueryResponse response = solrClient.query(solrConfigProperties.getCore(), mapSolrParams);
// 獲取結(jié)果集
SolrDocumentList results = response.getResults();
for (SolrDocument result : results) {
// SolrDocument 數(shù)據(jù)結(jié)構(gòu)為Map
System.out.println(result);
}
solrClient.close();
return results;
}
刪除索引
需要?jiǎng)h除索引時(shí),根據(jù)id去刪除即可。
@GetMapping("/Delete")
public void solrDelete(@RequestParam("id") String id) throws Exception {
HttpSolrClient solrClient = SolrClient.getClient(solrConfigProperties.getServer());
// 通過(guò)id刪除 執(zhí)行要?jiǎng)h除的collection(core)
solrClient.deleteById(solrConfigProperties.getCore(), id);
// 還可以通過(guò)查詢條件刪除
// solrClient.deleteByQuery(solrConfigProperties.getCore(), "查詢條件");
// 提交刪除
solrClient.commit(solrConfigProperties.getCore());
solrClient.close();
}
本文所用資源匯總:
本文已配置的 Solr7.7.1
https://pan.baidu.com/s/11s18oJVKpEVc-AmZO1xkgA本文源碼
https://github.com/JasonGofen/SolrProjectSolr 官網(wǎng)
https://lucene.apache.org/solr/Solr API 官方文檔
http://lucene.apache.org/solr/7_7_1/solr-solrj/index.htmlSolr 中文文檔(譯版)
https://www.w3cschool.cn/solr_doc/solr_doc-t3642fkr.htmlJDK 8
Java SE Development Kit 8 下載Solr 7.7.1 壓縮包
http://archive.apache.org/dist/lucene/solr/IK 分詞 jar 包
https://search.maven.org/remotecontent?filepath=com/github/magese/ik-analyzer/7.7.1/ik-analyzer-7.7.1.jarIK 分詞 GitHub 源碼
https://github.com/magese/ik-analyzer-solr7動(dòng)態(tài)詞庫(kù)自動(dòng)加載
https://github.com/liang68/ik-analyzer-solr6
http://www.cnblogs.com/liang1101/articles/6395016.html同義詞典、擴(kuò)展詞典、停止詞典介紹 Blog
https://blog.csdn.net/zcl_love_wx/article/details/52092894創(chuàng)建 Spring boot 項(xiàng)目的網(wǎng)址
https://start.spring.io/
-END-如果看到這里,說(shuō)明你喜歡這篇文章,請(qǐng)轉(zhuǎn)發(fā)、點(diǎn)贊。同時(shí)標(biāo)星(置頂)本公眾號(hào)可以第一時(shí)間接受到博文推送。推薦閱讀1.?基友說(shuō):“自己整一個(gè)”2.?HashMap為什么線程不安全?3.?一致性Hash在負(fù)載均衡中的應(yīng)用4.?60個(gè)相見(jiàn)恨晚的神器工具
總結(jié)
以上是生活随笔為你收集整理的微服务集成cas_Spring Boot + Solr 全文检索微服务简易集成的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在java中为什么_属性绑定到类型_方法
- 下一篇: SpringBoot - MyBatis