Spring Boot + Solr 全文檢索微服務簡易集成

優質文章,及時送達

鏈接: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端進行添加、修改、刪除索引和查詢的操作。至於如何結合現有業務系統,我們後面介紹。

Spring Boot + Solr 全文检索微服务简易集成

圖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

  • 啟動完成後的控制檯截圖:

Spring Boot + Solr 全文检索微服务简易集成

圖2 控制檯Solr啟動完成圖

  • 隨後我們訪問<code>http://localhost:8983/<code>即能看到Solr Server端的<code>Web/<code>頁面了

Spring Boot + Solr 全文检索微服务简易集成

圖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>

Spring Boot + Solr 全文检索微服务简易集成

圖4 選擇TestCore

Spring Boot + Solr 全文检索微服务简易集成

圖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

  1. 將下載好的<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

  1. 將下載好的<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>關鍵字後所出現的分詞效果。

Spring Boot + Solr 全文检索微服务简易集成

圖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個相見恨晚的神器工具

Spring Boot + Solr 全文检索微服务简易集成


分享到:


相關文章: