優質文章,及時送達
鏈接:https://www.jianshu.com/p/95869ade37b3
本文內容主要講解Solr 7.7.1 環境搭建後使用Spring boot 2.1.3集成SolrJ實現簡易全文檢索微服務,對於Solr與Spring boot的介紹內容網上資料很多,本文不再贅述。
關於本文內容所涉及資源在最後會給大家統一都列出來。
一、環境說明
Spring boot 結合 SolrJ 實現對Solr Server的訪問是非常簡單的,它們相互之間的關係如下圖所示。
主體實現是通過在Spring boot微服務中集成SolrJ,配置好Solr Server參數,調用SolrJ中的CRUD API實現請求Solr Server端進行添加、修改、刪除索引和查詢的操作。至於如何結合現有業務系統,我們後面介紹。
圖1 簡易環境說明
下面以最簡單快速的方式實現全文檢索基礎CRUD功能。
二、搭建Solr 7.7.1 Server端
因自己的電腦硬盤空間滿了沒裝Linux虛擬機,就以Windows為例安裝Solr Server端了。其實總體而言兩個系統對Solr Server端的操作類似,各位看官舉一反三就好,就兩種系統部署Solr的不同下面也會做相應的提及。
已配置好的Solr 7.7.1下載:
https://pan.baidu.com/s/11s18oJVKpEVc-AmZO1xkgA
我們首先來了解一下Solr的常見命令:
啟動:
./solr start
關閉:
./solr stop -all
重啟:
./solr restart
創建Core:
./solr create -c YourCoreName -d _default
刪除Core:
./solr delete -c YourCoreName
關於Solr更細緻的內容,大家可以參閱下方鏈接:
Solr 官網
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的安裝在這就不說了,網上有很多資料。\\
Java SE Development Kit 8 下載
下載Solr 7.7.1壓縮包:請注意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下解壓壓縮包到對應的目錄,我的路徑是:
C:\\myworking\\solr-7.7.1
Linux下使用 tar 命令解壓Solr壓縮包:
tar zxvf solr-7.7.1.tgz -C /myworking
步驟1-3:進入bin目錄運行Solr
Windows與Linux操作solr的命令都是一樣的,但都需要進入到Solr的<code>bin/<code>目錄下,我的目錄是<code>C:\\myworking\\solr-7.7.1\\bin/<code>。linux的目錄使用<code>cd/<code>命令進入即可。
進入的到<code>bin/<code>目錄下執行啟動 命令:
./solr start
啟動完成後的控制檯截圖:
圖2 控制檯Solr啟動完成圖
隨後我們訪問<code>http://localhost:8983/<code>即能看到Solr Server端的<code>Web/<code>頁面了
圖3 Solr Server端 Web首頁
步驟1-4:創建Core
Solr <code>Core/<code>的創建有兩種方式,第一種是通過命令行的方式,第二種是在Solr<code>Web/<code>首頁中創建。
個人比較推薦第一種,原因有二,一是方便快捷在命令行一句話搞定,<code>Ctrl+c Ctrl+v/<code>齊活兒,不用在頁面上點來點去還得敲文字,二是所在公司大牛在實踐過後說是如果採用的第二種方式創建出的<code>Core/<code>會有一些問題。本著
聽人話,吃飽飯的態度就採用第一種吧~ ~*大家可以實踐一下然後分享給我哦。*當然兩種方式還是要介紹下的。使用命令行創建<code>Core/<code>
我們只需要進入到上述的<code>bin/<code>目錄,複製以下命令即可創建<code>Core/<code>,命令中的<code>TestCore/<code>為名稱可以自行替換:
./solr create -c TestCore -d _default
使用<code>Web/<code>端創建<code>Core/<code>
上述圖3中左側的列表第3個<code>Core Admin/<code>菜單項,點開後就明白怎麼做了。
在<code>Web/<code>端查看<code>TestCore/<code>
圖4 選擇TestCore
圖5 TestCore詳情圖
步驟2:配置IK-Analyzer中文分詞
介紹性的內容還是不羅列了,大家自己百度吧。Ik-Analyzer分詞據說是國內最好用的中文分詞,大部分人都用這個。目前Solr-7.7.1也自帶了一箇中文分詞,具體的對比我沒做過,等裝完IK後大家回來可以進行下對比。同時歡迎分享給我哦。
-
IK分詞GitHub:
https://github.com/magese/ik-analyzer-solr7
動態詞庫自動加載:
https://github.com/liang68/ik-analyzer-solr6
http://www.cnblogs.com/liang1101/articles/6395016.html
PS:關於動態詞庫自動加載,這個大家看一下下面這段引用描述後視項目情況選擇要不要去研究下。
如果只是在我們原有的業務系統中簡單集成Solr,那暫時沒必要去了解動態詞庫自動加載。如果像商城等業務系統中,對於搜索模塊是業務系統的核心之一,那麼簡單使用IK可能無法達到線上使用的要求。在IK分詞器中默認是一次啟動將主詞庫、停用詞以及擴展詞庫全部加載完畢,後續如果再想要增加額外的擴展詞,就必須得修改對應的擴展詞表重新打包上傳並重啟服務方能生效,這種方式不適合應用與線上服務。那麼到底如何實現這種無縫擴充詞庫呢?大家可以看看上面的博客。
步驟2-1:配置IK-analyzer jar包和詞庫
首先需要大家下載jar包和源碼,我們下面需要放到Solr Server端對應的目錄下。
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
將下載好的<code>ik-analyzer-7.7.1.jar/<code>包放入Solr服務的<code>webapp\\WEB-INF\\lib/<code>目錄下,我的目錄全路徑是:
C:\\myworking\\solr-7.7.1\\server\\solr-webapp\\webapp\\WEB-INF\\lib
將下載好的<code>ik-analyzer-solr7-master/<code>源碼下的<code>src\\main\\resources/<code>目錄中的文件***(如下)***,放入到<code>webapp\\WEB-INF\\classes/<code>目錄下:
① IKAnalyzer.cfg.xml 擴展配置文件
② ext.dic 擴展詞庫
③ stopword.dic 停止詞庫
④ ik.conf 動態詞庫配置文件
⑤ dynamicdic.txt 動態詞庫
我的目錄全路徑是:
C:\\myworking\\solr-7.7.1\\server\\solr-webapp\\webapp\\WEB-INF\\classses
關於詞庫中同義詞庫、擴展詞庫、停止詞庫的介紹,可以看下面的blog:
https://blog.csdn.net/zcl_love_wx/article/details/52092894
步驟2-2. 配置<code>TestCore/<code>的<code>server\\solr\\TestCore\\conf\\managed-schema/<code>,添加IK分詞器,示例如下:
<fieldtype>
<analyzer>
<tokenizer>
<filter>
<analyzer>
<tokenizer>
<filter>
*PS:放在<code><schema>/<code>標籤下。*同時在該標籤下我們還需要配置field,請看步驟3。
步驟3:配置field
Solr filed域的配置極為重要,filed的配置會影響到索引的創建和查詢出的結果展示。
<field>
<field>
<field>
<field>
<copyfield>
name:查詢時的名稱
type:這個是之前定義的FieldType的名稱,在這使用的ik分詞
indexed:是否索引(true/false)
stored:是否存儲(是否將索引結果存儲到索引庫)
multivalued:是否多值(一般配合copyField使用)
動態filed
在定義<code>filed/<code>時,可能會隨著業務主線作出變更,那麼每次在<code>managed-schema/<code>更改<code>filed/<code>後,還需重啟Solr也是個麻煩事兒。那麼在生產環境如此操作可能顯得不是那麼理想了。那麼可以在變更時使用類似通配符的方式建立動態<code>filed/<code>,比如<code>name="title"/<code>可以寫成<code>name="fl_*"/<code>,這樣只要以<code>fl_/<code>開頭的索引都可以被建立。
步驟4:重啟Solr服務,測試ik分詞
這裡請注意<code>Analyse Fieldname / FieldType:/<code>右邊的下拉列表,需要去選中ik分詞<code>text_ik/<code>。我們可以看到輸入<code>中華人民共和國/<code>關鍵字後所出現的分詞效果。
圖6 分詞效果圖
至此我們的Solr Server端基礎版就搭建完成了,下面開始使用Spring boot結合SolrJ進行全文檢索微服務的搭建。
三、Spring boot 微服務實現
Spring boot的基礎知識不講解了,下面我們採用Spring boot 2.1.3結合SolrJ 7.7.1完成全文檢索微服務的實現。
下載源碼
https://github.com/JasonGofen/SolrProject
步驟1:在本地準備將要建立索引的文件
準備兩個doc文檔,寫入一些自定內容,放到指定目錄下,當然也不一定非得要doc。以下是我準備的兩個文件:
C:\\solrfile\\data\\鵝鵝鵝.pdfC:\\solrfile\\data\\靜夜思.docx
步驟2:搭建Spring boot項目
創建項目,在<code>pom.xml/<code>引入<code>SolrJ/<code>的Maven依賴
<dependency>
<groupid>org.apache.solr/<groupid>
<artifactid>solr-solrj/<artifactid>
<version>7.7.1/<version>
<dependency>
<groupid>org.apache.tika/<groupid>
<artifactid>tika-core/<artifactid>
<version>1.9/<version>
目錄結構
├── src
│ └── main
│ ├── java
│ │ └── com.jasongofen
│ │ ├── client
│ │ │ └── SolrClient.java // Solr客戶端
│ │ ├── config
│ │ │ ├── CorsConfig.java // 跨域配置文件
│ │ │ └── SolrConfigProperties.java // yml屬性實例化配置文件
│ │ ├── test
│ │ │ └── SolrCURDTest.java // Solr API調用測試示例
│ │ ├── util
│ │ │ ├── ConvertUtil.java // 自定義轉換工具類
│ │ │ └── TikaUtil.java // 提取文檔內容工具類
│ │ └── SolrProjectApplication.java // Spring boot啟動類
│ └── resources
│ ├── application.yml // 項目配置
│ ├── banner.txt // banner配置
│ └── logback-spring.xml // 日誌配置
├── pom.xml // 依賴配置
└── README.md // 項目幫助文檔
配置<code>application.yml/<code>中<code>solr/<code>節點下的屬性值***(必須)***
# solr配置
solr:
# Solr Server端地址
server: localhost:8983 # 設置你的Solr Server訪問地址
# Solr Core名稱
core: TestCore # 設置你的Solr Core名稱
# 上面準備的文檔的所在本地路徑
dir: C:\\solrfile\\data\\ # 設置你的需要建立索引的文件所在目錄
步驟3:運行項目
下面就可以運行項目了,SolrJ API調用請看以下內容。未完待續
SolrJ API調用說明
基礎的API調用代碼在項目目錄<code>src\\main\\java\\com.jasongofen.test\\SolrCURDTest.java/<code>文件中,該<code>java/<code>是一個<code>Controller/<code>可以以<code>http/<code>請求的方式模擬其他業務系統調用過程。
添加、修改索引
添加索引時首先使用<code>HttpSolrClient/<code>與<code>Solr Server/<code>建立連接,隨後解析需要建立索引的文件*(至於需要結合現有的業務系統是採用<code>http ftp/<code>等方式從各自的文件Server中獲取,還是另外的方式,請結合當前項目業務需要作擴展即可)*,接著把解析出的文件數據放到對應的索引位置,在設置索引內容時<code>id/<code>字段是必須要設置的且全局唯一,最後提交索引並關閉<code>SolrClient/<code>。
修改索引時,如果<code>id/<code>在索引庫中已存在,則執行更新操作。
@GetMapping("/Add")
public void solrAdd throws Exception {
// 設置文件路徑
List<string> files = new ArrayList<>;/<string>
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 = "";
// 獲取文件流,取出文件內容
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;
// 執行添加 ps:如果id相同,則執行更新操作
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;
}
查詢
查詢時因返回的是JSON串,並未做前端頁面展示,請根據業務需求自行定製。
@GetMapping("/Query")
public SolrDocumentList solrQuery throws Exception {
HttpSolrClient solrClient = SolrClient.getClient(solrConfigProperties.getServer);
// 定義查詢條件
Map<string> params = new HashMap<string>;/<string>/<string>
params.put("q", "*:*");
SolrParams mapSolrParams = new MapSolrParams(params);
//執行查詢 第一個參數是collection,就是我們在solr中創建的core
QueryResponse response = solrClient.query(solrConfigProperties.getCore, mapSolrParams);
// 獲取結果集
SolrDocumentList results = response.getResults;
for (SolrDocument result : results) {
// SolrDocument 數據結構為Map
System.out.println(result);
}
solrClient.close;
return results;
}
刪除索引
需要刪除索引時,根據<code>id/<code>去刪除即可。
@GetMapping("/Delete")
public void solrDelete(@RequestParam("id") String id) throws Exception {
HttpSolrClient solrClient = SolrClient.getClient(solrConfigProperties.getServer);
// 通過id刪除 執行要刪除的collection(core)
solrClient.deleteById(solrConfigProperties.getCore, id);
// 還可以通過查詢條件刪除
// solrClient.deleteByQuery(solrConfigProperties.getCore, "查詢條件");
// 提交刪除
solrClient.commit(solrConfigProperties.getCore);
solrClient.close;
}
本文所用資源彙總:
本文已配置的 Solr7.7.1https://pan.baidu.com/s/11s18oJVKpEVc-AmZO1xkgA
本文源碼https://github.com/JasonGofen/SolrProject
Solr 官網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
JDK 8Java 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.jar
IK 分詞 GitHub 源碼https://github.com/magese/ik-analyzer-solr7
動態詞庫自動加載
https://github.com/liang68/ik-analyzer-solr6
http://www.cnblogs.com/liang1101/articles/6395016.html
同義詞典、擴展詞典、停止詞典介紹 Bloghttps://blog.csdn.net/zcl_love_wx/article/details/52092894
創建 Spring boot 項目的網址https://start.spring.io/
-END-
如果看到這裡,說明你喜歡這篇文章,請轉發。同時標星(置頂)本公眾號可以第一時間接受到博文推送。1. 基友說:“自己整一個”HashMap為什麼線程不安全?3.一致性Hash在負載均衡中的應用60個相見恨晚的神器工具
閱讀更多 程序猿久一 的文章