全文搜索引擎—Solr入門淺析

一.簡(jiǎn)介

????????Solr是一個(gè)獨(dú)立的企業(yè)級(jí)搜索應(yīng)用服務(wù)器,它對(duì)外提供類似于Web-service的API接口。用戶可以通過http請(qǐng)求,向搜索引擎服務(wù)器提交一定格式的XML文件或JSON格式數(shù)據(jù),生成索引;也可以通過Http Get操作提出查找請(qǐng)求,并得到XML/JSON格式的返回結(jié)果。

????????Solr是一個(gè)高性能,采用Java5開發(fā),底層基于Lucene的全文搜索服務(wù)器。同時(shí)對(duì)其進(jìn)行了擴(kuò)展,提供了比Lucene更為豐富的查詢語言,同時(shí)實(shí)現(xiàn)了可配置、可擴(kuò)展并對(duì)查詢性能進(jìn)行了優(yōu)化,并且提供了一個(gè)完善的功能管理界面,是一款非常優(yōu)秀的全文搜索引擎,單純作為一個(gè)開源的全文搜索引擎工具的話,solr豐富的功能也可作為一個(gè)黑盒子做到開箱即用。目前大部分的電商平臺(tái)都在采用solr作為其商品搜索引擎。

????????這里再講一下全文搜索引擎的實(shí)現(xiàn)原理,全文搜索引擎之所以可以實(shí)現(xiàn)全文搜索,最根本的原理是其數(shù)據(jù)索引使用的是倒排索引,跟我們常見的數(shù)據(jù)庫(kù)中的索引順序或者關(guān)聯(lián)方向正好是相反的,就拿文章標(biāo)題和文章內(nèi)容舉例,傳統(tǒng)數(shù)據(jù)庫(kù)中的一般的索引關(guān)聯(lián)是這個(gè)文章標(biāo)題id對(duì)應(yīng)這篇文章的內(nèi)容,是從文章標(biāo)題id向文章內(nèi)容這個(gè)方向建立的關(guān)聯(lián)關(guān)系,而倒排索引將這個(gè)模型顛倒過來了,將文章中的每個(gè)詞語、每個(gè)關(guān)鍵字與它們出現(xiàn)的文章標(biāo)題對(duì)應(yīng)起來,建立關(guān)聯(lián)索引,從而實(shí)現(xiàn)了通過搜索關(guān)鍵字詞可以搜索到相關(guān)的文章內(nèi)容和哪一篇文章中出現(xiàn)過你搜素的關(guān)鍵字詞。

二.安裝部署

????????solr需要運(yùn)行在一個(gè)Servlet容器中,Solr6.5.1要求jdk使用1.8以上,Solr默認(rèn)提供Jetty(solr自身集成了Jetty,java寫的Servlet容器,也可以直接啟動(dòng)),這里說下用Tocmat作為Servlet容器,環(huán)境如下:Linux:Red hat 6.0 ,Solr:Solr6.5.1,Jdk:jdk1.8.0_121,Tomcat:apache-tomcat-8.5.14(solr6.5.1需要tomcat8.0以上)

1.安裝jdk?

2.安裝tomcat?

2.1.下載Tomcat包,6.0以上的solr需要tomcat8以上,使用tomcat7問題太多。

apache-tomcat-8.5.14.tar.gz

2.2.手動(dòng)上傳Tomcat,解壓

[root@localhost /]#tar -zvxf apache-tomcat-8.5.14.tar.gz

2.3.建立solr文件路徑

[root@localhost /]#mkdir /usr/local/solr

2.4.復(fù)制Tomcat文件到solr目錄

[root@localhost /]#cp apache-tomcat-8.5.14 /usr/local/solr/tomcat -r

3.上傳solr到服務(wù)器

可使用rz上傳

4.解壓solr

[root@localhost /]#tar -zxf solr-6.5.1.tgz

5.solr-6.5.1\server下的solr-webapp/webapp文件夾拷貝到tomcatwebapps下,并重命名為solr

[root@localhost tmp]#cp ?solr-6.5.1/server/solr-webapp/webapp ?/usr/local/solr/tomcat/webapps/solr -r

6.拷貝solr-6.5.1\server\lib\ext下的jar包到tomcat\webapps\solr項(xiàng)目的WEB-INF\lib下;

[root@localhost tmp]#cp solr-6.5.1/server/lib/ext/* /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

7.拷貝solr-6.5.1\dist下solr-dataimporthandler ?jar包,solr-dataimporthandler-extras-6.5.1.jar包到tomcat\webapps\下solr項(xiàng)目的WEB-INF\lib下

[root@localhost tmp]#cp solr-6.5.1/dist/solr-dataimporthandler-6.5.1.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

[root@localhost tmp]#cp solr-6.5.1/dist/solr-dataimporthandler-extras-6.5.1.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

8.拷貝solr-6.5.1\server\lib下所有metrics開頭的jar

[root@localhost tmp]#cp ?solr-6.5.1/server/lib/metrics* ?/usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

9.拷貝solr-6.5.1\server下的solr文件夾到tomcatwebapps,重命名為solrhome或者是其他名字;

所謂的Solrhome目錄實(shí)際上是一個(gè)運(yùn)行的Solr實(shí)例所對(duì)應(yīng)的配置和數(shù)據(jù)(Lucene索引)。

[root@localhost tmp]#cp ?solr-6.5.1/server/solr ?/usr/local/solr/tomcat/webapps/solrhome ?-r

10.web.xml配置

修改tomcat\webapps\solr(solr的項(xiàng)目名)\WEB-INF\web.xml,找到如下代碼,去掉注釋,/put/your/solr/home/here改為你自己的solrhome的路徑,如:

[root@localhost WEB-INF]# vim/usr/local/solr/tomcat/webapps/solr-webapp/webapp/WEB-INF/web.xml

找到,去掉注釋,修改路徑為/usr/local/solr/tomcat/webapps/solrhome/


找到以下代碼并注釋,解決權(quán)限問題




11.拷貝solr-6.1.0\server\resources下的log4j.properties到tomcat\webapps\solr\WEB-INF\classes,如果WEB-INF下沒有classes文件那么就創(chuàng)建一個(gè)classes文件夾。

[root@localhost ~]#cd /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes

[root@localhost WEB-INF]#mkdir ?classes

[root@localhost tmp]#cp ?solr-6.5.1/server/resources/log4j.properties ?/usr/local/solr/tomcat/webapps/solr/WEB-INF/classes

12.啟動(dòng)tomcat

[root@localhost /]#cd ?/usr/local/solr/tomcat?

[root@localhost tomcat]#bin/startup.sh

13.訪問

http://192.168.163.100:8080/solr/index.html#/ ??


此頁(yè)面是solr自帶的一個(gè)控制臺(tái)頁(yè)面,可以進(jìn)行solr內(nèi)核、solr索引創(chuàng)建與管理,數(shù)據(jù)搜索和測(cè)試等。

創(chuàng)建一個(gè)core(就是創(chuàng)建一個(gè)solr內(nèi)核,類似于數(shù)據(jù)庫(kù)中新建一個(gè)數(shù)據(jù)庫(kù)實(shí)例)

(1)在solrhome下面創(chuàng)建my_core文件夾(就是solr內(nèi)核名,可根據(jù)實(shí)際命名),在my_core文件夾下創(chuàng)建data和conf文件夾

[root@localhost solrhome]#mkdir my_core

[root@localhost solrhome]#cd my_core

[root@localhost my_core]#mkdir data

[root@localhost my_core]#mkdir conf

[root@localhost my_core]# ll

總用量 0

drwxr-xr-x. 2 root root 6 5月 8 04:00 conf

drwxr-xr-x. 2 root root 6 5月 8 04:00 data

(2)將solr-6.3.0\example\example-DIH\solr\solr\solr\conf所有文件和文件夾都copy到solrhome\my_core\conf下;

[root@localhost tmp]#cp -Rf solr-6.5.1/example/example-DIH/solr/solr/conf/* /usr/local/solr/tomcat/webapps/solrhome/my_core/conf/

3啟動(dòng)tomcat,訪問solr,創(chuàng)建core,新增core即可完成;


(4)可以在“core selector”這里查詢和編輯你的solr相關(guān)信息;

三.配置solr索引文件說明

????????solr安裝好建立了第一個(gè)solr內(nèi)核之后,就可以往內(nèi)核里導(dǎo)入數(shù)據(jù)了,solr可以導(dǎo)入數(shù)據(jù)庫(kù)數(shù)據(jù),也可以導(dǎo)入二進(jìn)制文件中的文本(PDF、微軟office、和OpenOffice等)等其他數(shù)據(jù)。solr自身帶了幾個(gè)文檔索引導(dǎo)入工具:(1)數(shù)據(jù)庫(kù)導(dǎo)入處理器Data Import Handler ,DIH ?(2)ExtractingRequestHandler ,又名Solr Cell ,solr cell 使用Apache的Tika工具進(jìn)行文本抽取,從而從二進(jìn)制文件中抽取文本和元數(shù)據(jù)? ? ? ? (3)Apache Nutch,一個(gè)基于java的開源網(wǎng)絡(luò)爬蟲,可以與solr無縫集成,開箱即用,可以實(shí)現(xiàn)采集到的網(wǎng)頁(yè)被自己的solr應(yīng)用搜索到。(4)java項(xiàng)目使用solr的客戶端SolrJ進(jìn)行交互

????????solr中有兩個(gè)重要的配置文件: solrconfig.xml(索引管理配置文件)和schema.xml(創(chuàng)建索引文件),下面講下schema.xml,位于內(nèi)核目錄下的conf目錄下

在schema.xml中建立solr索引字段就類似于數(shù)據(jù)中在表中定義相關(guān)的數(shù)據(jù)字段,其字段的種類包含多值字段、動(dòng)態(tài)字段、復(fù)制字段、唯一鍵字段等。

1、在solr中默認(rèn)是中文分析器,需要手工配置。配置一個(gè)FieldType,在FieldType中指定中文分析器(分詞器相關(guān)下面會(huì)說到)。

2、Solr中的字段必須是先定義后使用。

3、在solrhome建的內(nèi)核文件夾的conf的managed-schema文件配置索引,老版本solr是schema.xml

4. ? 假設(shè)定義了幾個(gè)如下圖所示的業(yè)務(wù)字段


????????其中type是指定該字段用哪個(gè)分詞器匹配,indexed=true是能夠被搜索到,stored=true是可以在搜到后返回?cái)?shù)據(jù)用于前臺(tái)顯示,設(shè)置false,前臺(tái)不會(huì)顯示該字 ? ? ? ? ? 段數(shù)據(jù),下面的將上面常用的搜索字段都配置到一個(gè)復(fù)制字段中,是solr自優(yōu)化的一種配置方法,就類似以數(shù)據(jù)庫(kù)中原來需要多表聯(lián)查的數(shù)據(jù),改造成單表查詢 ? ? ? ? 的,這樣的查詢和執(zhí)行速率更高。這樣solr索引就配置好了,就可以向solr中導(dǎo)入數(shù)據(jù)了,這個(gè)schema.xml中配置的所有字段相當(dāng)于數(shù)據(jù)庫(kù)中的一張大表。

四.分詞器相關(guān)說明

????????在搜索引擎的發(fā)展中,一開始的搜索引擎可以通過簡(jiǎn)單的輸入關(guān)鍵詞進(jìn)行內(nèi)容搜索匹配,隨著信息技術(shù)的發(fā)展,用戶輸入的內(nèi)容不再僅僅局限于關(guān)鍵字了,可能會(huì)輸入一段話或者描述進(jìn)行搜索,但是全文搜索引擎的本質(zhì)還是基于關(guān)鍵字詞搜索的,這個(gè)時(shí)候怎么才能將用戶輸入內(nèi)容進(jìn)行分析搜索呢,于是就誕生了分詞器,分詞器可以將用戶輸入的話語和描述,分成一些關(guān)鍵字或者詞,然后再傳入到搜索引擎進(jìn)行搜索。

目前開源的分詞器也比較多,這里介紹IK-Analyzer——IK分詞器。solr的除了自身強(qiáng)大的功能外,還可以自由的集成其他優(yōu)秀的擴(kuò)展件,solr自身也帶了幾個(gè)分詞器,大多是英文的,這里ik是中文分詞器。

? ? ? IK-Analyzer——IK分詞器集成到solr

1.第一步:使用IK-Analyzer。把分析器的文件夾上傳到服務(wù)器。


2.第二步:需要把分析器的jar包添加到solr工程中。

[root@bogon IK Analyzer 2012FF_hf1]# cp ik-analyzer-solr5-5.x.jar/usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

[root@bogon IK Analyzer 2012FF_hf1]# cp solr-analyzer-ik-5.1.0.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

3.第三步:需要把IKAnalyzer需要的擴(kuò)展詞典及停用詞詞典、配置文件復(fù)制到solr工程的classpath。

/usr/local/solr/tomcat/webapps/solr/WEB-INF/classes

[root@bogon IK Analyzer 2012FF_hf1]# cp ?IKAnalyzer.cfg.xml ? ext_stopword.dic ? mydict.dic ? /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes

注意:擴(kuò)展詞典及停用詞詞典的字符集必須是utf-8。不能使用windows記事本編輯,注意每配置一個(gè)詞要換行。

其中ext_stopword.dic(停用字典是用于配置語句中類似一些語氣詞 啊 這 那 等一些對(duì)搜索沒有幫助的字和詞的),

mydict.dic(用戶拓展字典)是用于根據(jù)自己系統(tǒng)配置一些讓分詞器認(rèn)為是一個(gè)完整的關(guān)鍵詞,這樣在搜索時(shí)分詞器就不會(huì)將這個(gè)詞再給繼續(xù)拆分成更細(xì)的關(guān)鍵詞了。

4.第四步:配置fieldType。需要在solrhome/collection1/conf/schema.xml中配置。

技巧:使用vi、vim跳轉(zhuǎn)到文檔開頭gg。跳轉(zhuǎn)到文檔末尾:G


5.配置好分詞器,重啟solr,在solr自帶的控制臺(tái)頁(yè)面可以體驗(yàn)安裝好的分詞器,試試分詞效果。

在建好的solr內(nèi)核下的Analysis菜單下的FieldType選擇剛才安裝的ik分詞詞,這里顯示的名字就是在schema.xml配置的名字。


輸入一句話,查看分詞效果,最終分詞的效果可以通過分詞的停用詞典和拓展詞典進(jìn)行調(diào)節(jié),這和搜索引擎應(yīng)用的建立是一樣的,要想做出更好用的搜索應(yīng)用,需要不斷的進(jìn)行優(yōu)化。



五.其他參數(shù)說明

將數(shù)據(jù)導(dǎo)入到solr中建立好索引之后,在進(jìn)行搜索時(shí),有幾個(gè)重要參數(shù),需要明確。

1.在將數(shù)據(jù)導(dǎo)入到solr中之后,在solr的控制臺(tái)頁(yè)面可以進(jìn)行搜索查看導(dǎo)入的數(shù)據(jù),在建立的內(nèi)核的Query菜單下,如下圖,在我導(dǎo)入了一份電商商品的數(shù)據(jù),默認(rèn)搜索全部,總數(shù)據(jù)條數(shù)3096條。



2.參數(shù) ? q ? :主查詢字段,用于輸入搜索內(nèi)容

? ?參數(shù) ? fq ?:過濾查詢,限制搜索結(jié)果,可用來限定搜索范圍,過濾搜索內(nèi)容

? ?參數(shù) sort :用于指定搜索結(jié)果排序的字段,如輸入 price asc 就是按價(jià)格從低到高排列

? ?參數(shù) start ,rows :首頁(yè)從那一條數(shù)據(jù)開始,每頁(yè)顯示幾條數(shù)據(jù),用于搜索返回結(jié)果分頁(yè)的

? ?參數(shù) ? fl ? ?: ? ? 為搜索結(jié)果中的每個(gè)文檔指定要返回的字段

? ?參數(shù) ?df ? : ?默認(rèn)搜索字段

? ?參數(shù) ? wt ?:指定響應(yīng)輸出類型,xml,csv,php,python,json等

????????還有一些高級(jí)功能如分面與搜索結(jié)果高亮等。其中最常用的搜索結(jié)果高亮參數(shù) hl ?,可以指定那些索引字段加搜索結(jié)果高亮,以及設(shè)定高亮的樣式等。這個(gè)搜索結(jié)果高亮幾乎是現(xiàn)在搜索引擎必備的一個(gè)功能,很提升用戶體驗(yàn)的一個(gè)功能,會(huì)將搜索結(jié)果中的用戶輸入搜索的關(guān)鍵字進(jìn)行樣式區(qū)別顯示,其原理也比較簡(jiǎn)單,由于搜索引擎本身可以按照用戶的搜索的關(guān)鍵字詞給匹配出相應(yīng)的內(nèi)容,然后在匹配出的內(nèi)容中將含有用戶輸入的搜索關(guān)鍵詞用前臺(tái)頁(yè)面的樣式標(biāo)簽給包起來,這樣數(shù)據(jù)最終返回給前臺(tái)頁(yè)面顯示的時(shí)候,搜索關(guān)鍵詞自然會(huì)高亮顯示。

????????其中q 和fq都可以當(dāng)做一個(gè)過濾器使用,q是一個(gè)特殊的過濾器。fq過濾器用法 ?fq:字段名:值1 ?OR/AND ?字段名:值2 ? ?比如限定商品的搜索范圍 ?fq=

item_category_name:空調(diào)ANDitem_price:2000 ?就是搜索價(jià)格是2000的空調(diào)。用fq過濾器就可以實(shí)現(xiàn)一些對(duì)于不同用戶可以搜索的內(nèi)容范圍不一樣的需求,可以實(shí)現(xiàn)搜索應(yīng)用的搜索范圍權(quán)限問題。


????????總之,solr的各種功能非常豐富,solr也在越更新越強(qiáng)大,還有一些solr進(jìn)階的操作像solrcloud下的分布式索引、分布式搜索、分片、備份等高級(jí)操作感興趣的同學(xué)可以進(jìn)階學(xué)習(xí)。還有就是solr由于本身是個(gè)搜索引擎,因此也可以做一些簡(jiǎn)單的推薦功能,根據(jù)用戶注冊(cè)的一些關(guān)注點(diǎn),可以從自己的索引庫(kù)里將有關(guān)內(nèi)容搜索出來推送給用戶,做一些簡(jiǎn)單的推薦功能。

????????在百度網(wǎng)盤我上傳了一個(gè)solr電商搜索的小demo,以及相關(guān)商品數(shù)據(jù)(mysql數(shù)據(jù)庫(kù)導(dǎo)出的),一些簡(jiǎn)單的基礎(chǔ)用法可以進(jìn)行參考:https://pan.baidu.com/s/1dFAk9rF?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容