一、前言
在開發網站/App項目的時候,通常需要搭建搜索服務。比如,新聞類應用需要檢索標題/內容,社區類應用需要檢索用戶/帖子。
對于簡單的需求,可以使用數據庫的 LIKE 模糊搜索,示例:
SELECT * FROM news WHERE title LIKE '%法拉利跑車%'
可以查詢到所有標題含有 "法拉利跑車" 關鍵詞的新聞,但是這種方式有明顯的弊端:
1、模糊查詢性能極低,當數據量龐大的時候,往往會使數據庫服務中斷;
2、無法查詢相關的數據,只能嚴格在標題中匹配關鍵詞。
因此,需要搭建專門提供搜索功能的服務,具備分詞、全文檢索等高級功能。 Solr 就是這樣一款搜索引擎,可以讓你快速搭建適用于自己業務的搜索服務。
二、安裝
到官網 http://lucene.apache.org/solr/ 下載安裝包,解壓并進入 Solr 目錄:
wget 'http://apache.website-solution.net/lucene/solr/6.2.0/solr-6.2.0.tgz'
tar xvf solr-6.2.0.tgz
cd solr-6.2.0
目錄結構如下:
啟動 Solr 服務之前,確認已經安裝 Java 1.8 :
啟動 Solr 服務:
./bin/solr start -m 1g
Solr 將默認監聽 8983 端口,其中 -m 1g 指定分配給 JVM 的內存為 1 G。
在瀏覽器中訪問 Solr 管理后臺:
http://127.0.0.1:8983/solr/#/
創建 Solr 應用:
./bin/solr create -c my_news
可以在 solr-6.2.0/server/solr 目錄下生成 my_news 文件夾,結構如下:
同時,可以在管理后臺看到 my_news:
三、創建索引
我們將從 MySQL 數據庫中導入數據到 Solr 并建立索引。
首先,需要了解 Solr 中的兩個概念: 字段(field) 和 字段類型(fieldType),配置示例如下:
field 指定一個字段的名稱、是否索引/存儲和字段類型。
fieldType 指定一個字段類型的名稱以及在查詢/索引的時候可能用到的分詞插件。
將 solr-6.2.0\server\solr\my_news\conf 目錄下默認的配置文件 managed-schema 重命名為 schema.xml 并加入新的 fieldType:
在 my_news 目錄下創建 lib 目錄,將用到的分詞插件 ik-analyzer-solr5-5.x.jar 加到 lib 目錄,結構如下:
在 Solr 安裝目錄下重啟服務:
./bin/solr restart
可以在管理后臺看到新加的類型:
接下來創建和我們數據庫字段對應的 field:title 和 content,類型選為 text_ik:
將要導入數據的 MySQL 數據庫表結構:
編輯 conf/solrconfig.xml 文件,加入類庫和數據庫配置:
同時新建數據庫連接配置文件 conf/db-mysql-config.xml ,內容如下:
將數據庫連接組件 mysql-connector-java-5.1.39-bin.jar 放到 lib 目錄下,重啟 Solr,訪問管理后臺,執行全量導入數據:?
創建定時更新腳本:
加入到定時任務,每5分鐘增量更新一次索引:
在 Solr 管理后臺測試搜索結果:
至此,基本的搜索引擎搭建完畢,外部應用只需通過 http 協議提供查詢參數,就可以獲取搜索結果。
四、搜索干預
通常需要對搜索結果進行人工干預,比如編輯推薦、競價排名或者屏蔽搜索結果。Solr 已經內置了 QueryElevationComponent 插件,可以從配置文件中獲取搜索關鍵詞對應的干預列表,并將干預結果排在搜索結果的前面。
在 solrconfig.xml 文件中,可以看到:
定義了搜索組件 elevator,應用在 /elevate 的搜索請求中,干預結果的配置文件在 solrconfig.xml 同目錄下的 elevate.xml 中,干預配置示例:
重啟 Solr ,當搜索 "關鍵詞" 的時候,id 為 1和 4 的文檔將出現在前面,同時 id = 3 的文檔被排除在結果之外,可以看到,沒有干預的時候,搜索結果為:
當有搜索干預的時候:
通過配置文件干預搜索結果,雖然簡單,但是每次更新都要重啟 Solr 才能生效,稍顯麻煩,我們可以仿照 QueryElevationComponent 類,開發自己的干預組件,例如:從 Redis 中讀取干預配置。
五、中文分詞
中文的搜索質量,和分詞的效果息息相關,可以在 Solr 管理后臺測試分詞:
上例可以看到,使用 IKAnalyzer?分詞插件,對 “北京科技大學” 分詞的測試結果。當用戶搜索 “北京”、“科技大學”、“科技大”、“科技”、“大學” 這些關鍵詞的時候,都會搜索到文本內容含 “北京科技大學” 的文檔。
常用的中文分詞插件有 IKAnalyzer、mmseg4j和 Solr 自帶的 smartcn 等,分詞效果各有優劣,具體選擇哪個,可以根據自己的業務場景,分別測試效果再選擇。
分詞插件一般都有自己的默認詞庫和擴展詞庫,默認詞庫包含了絕大多數常用的中文詞語。如果默認詞庫無法滿足你的需求,比如某些專業領域的詞匯,可以在擴展詞庫中手動添加,這樣分詞插件就能識別新詞語了。
分詞插件還可以指定停止詞庫,將某些無意義的詞匯剔出分詞結果,比如:“的”、“哼” 等,例如:
六、總結
以上介紹了 Solr 最常用的一些功能,Solr 本身還有很多其他豐富的功能,比如分布式部署。
希望對你有所幫助。
七、附錄
1、參考資料:
http://lucene.apache.org/solr/quickstart.html
https://cwiki.apache.org/confluence/display/solr/Apache+Solr+Reference+Guide
2、上述 Demo 中用到的所有配置文件、Jar 包:
https://github.com/Ceelog/OpenSchool/blob/master/my_news.zip
3、還有疑問?聯系作者微博/微信 @Ceelog