Solr 6.2 搭建搜索引擎應用實踐

一、前言

在開發網站/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 6.2 目錄結構

啟動 Solr 服務之前,確認已經安裝 Java 1.8 :

查看 Java 版本

啟動 Solr 服務:

./bin/solr start -m 1g

Solr 將默認監聽 8983 端口,其中 -m 1g 指定分配給 JVM 的內存為 1 G。

在瀏覽器中訪問 Solr 管理后臺:

http://127.0.0.1:8983/solr/#/

Solr 管理后臺

創建 Solr 應用:

./bin/solr create -c my_news

可以在 solr-6.2.0/server/solr 目錄下生成 my_news 文件夾,結構如下:

my_news 目錄結構

同時,可以在管理后臺看到 my_news:

管理后臺

三、創建索引

我們將從 MySQL 數據庫中導入數據到 Solr 并建立索引。

首先,需要了解 Solr 中的兩個概念: 字段(field) 和 字段類型(fieldType),配置示例如下:

schema.xml 示例

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 目錄,結構如下:

my_news 目錄結構

在 Solr 安裝目錄下重啟服務:

./bin/solr restart

可以在管理后臺看到新加的類型:

text_ik 類型

接下來創建和我們數據庫字段對應的 field:title 和 content,類型選為 text_ik:

新建字段 title

將要導入數據的 MySQL 數據庫表結構:

編輯 conf/solrconfig.xml 文件,加入類庫和數據庫配置:

類庫
dataimport config

同時新建數據庫連接配置文件 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、參考資料:

https://wiki.apache.org/solr/

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


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內容

  • 兩年前用過solr5.1版本的,當時只是簡單入個門,拿來在項目里建個全文索引,然后再query,其他什么也沒做,還...
    Coselding閱讀 3,117評論 3 22
  • 1 準備工作及相關介紹 solr和lucene的版本是同步更新的,最新版本是6.5.0。本案例使用4.10.3 j...
    阿太哥閱讀 2,358評論 1 5
  • 在Solr 5.X以后,無論你是在Windos下還是在Linux下搭建Solr、Solr Cloud的都是極其簡單...
    簡單的土豆閱讀 1,750評論 0 7
  • ??Solr是一個高性能,采用Java5開發,基于Lucene的全文搜索服務器。同時對其進行了擴展,提供了比Luc...
    繾綣離愁閱讀 1,155評論 0 0
  • 生命一旦消逝便永不回復,即使他(她)以前活得多么耀眼,亦或多么狼狽,這些都失去了色彩。建立在生命轉順即逝這個基礎上...
    魚思魚閱讀 195評論 0 0