? ??????????????????????????????????????????????????????????????????????????????????????????搜索技術(shù)
SOLR和LUCENE關(guān)系
Solr是基于Lucene做的,Lucene是一套信息檢索工具包,但并不包含搜索引擎系統(tǒng),它包含了索引結(jié)構(gòu)、讀寫索引工具、相關(guān)性工具、排序等功能,因此在使用Lucene時你仍需要關(guān)注搜索引擎系統(tǒng),例如數(shù)據(jù)獲取、解析、分詞等方面的東西,所以必須要先了解LUCENE,再了解SOLR。而Solr的目標(biāo)是打造一款搜索引擎系統(tǒng),因此它更接近于我們認(rèn)識到的搜索引擎系統(tǒng),它是一個搜索引擎服務(wù),通過各種API可以讓你的應(yīng)用使用搜索服務(wù),而不需要將搜索邏輯耦合在應(yīng)用中。而且Solr可以根據(jù)配置文件定義數(shù)據(jù)解析的方式,更像是一個搜索框架,它也支持主從、熱換庫等操作。還添加了飄紅、facet等搜索引擎常見功能的支持。Lucene更像是一個SDK。 有完整的API族以及對應(yīng)的實現(xiàn)。你可以利用這些在自己的應(yīng)用里實現(xiàn)高級查詢(基于倒排索引技術(shù)的),Lucene對單機或者桌面應(yīng)用很實用很方便。但是Lucene,需要開發(fā)者自己維護索引文件,在多機環(huán)境中備份同步索引文件很是麻煩。于是,就有了Solr。Solr是一個有HTTP接口的基于Lucene的查詢服務(wù)器,封裝了很多Lucene細節(jié)。
Lucene想要實現(xiàn)一套完整的搜索引擎流程架構(gòu),不是不可以,只是要花費很長的時間和代價,因此公司一般都會采用SOLR來進行搜索服務(wù)的建立。
在結(jié)構(gòu)上SOLR和Lucene有很大的區(qū)別,Lucene是把代碼集成在web應(yīng)用中,然后通過代碼去調(diào)用索引庫進行查詢,而Solr是有自己的服務(wù),由web應(yīng)用去solr服務(wù)中請求,再由solr服務(wù)去索引庫中進行查詢

SOLR介紹
安裝
1、安裝前準(zhǔn)備
? ? ? ? ~JDK版本:必須是1.8以上的jdk版本,并進行環(huán)境變量的配置
? ? ? ? ~JDK版本:必須是1.8以上的jdk版本,并進行環(huán)境變量的配置
? ? ? ? ~TOMCAT優(yōu)化:加大內(nèi)存和連接數(shù)
? ? ? ? ~還需要配置server.xml

? ? ? ? ~操作系統(tǒng)優(yōu)化:/etc/sysctl.conf文件增加(linux操作系統(tǒng)才需要,文本演示window操作系統(tǒng))
? ??????net.ipv4.tcp_syncookies = 1
? ??????net.ipv4.tcp_tw_reuse = 1
? ??????net.ipv4.tcp_tw_recycle = 1
? ??????net.ipv4.tcp_fin_timeout = 5
? ? 2、本地安裝
? ??????SOLR下載:http://lucene.apache.org/solr/
? ??????1)在tomcat目錄下建立solrhome目錄,并在solrhome目錄下創(chuàng)建一個core目錄(實例),并在core目錄下創(chuàng)建data目錄(服務(wù)數(shù)據(jù)和日志的存放);

? ? ? ? 2) ?復(fù)制solr/server/solr/*所有文件到tomcat/solrhome目錄,用到創(chuàng)建solr的core時使用

????????復(fù)制到:

? ? ? ? 3)拷貝solrhome/configsets/basic_configs下的的conf文件夾到core文件夾下。
? ? ? ? 4)修改core/conf/solrconfig.xml文件:
? ? ? ? ? ? ? ? <dataDir>${solr.data.dir:剛才創(chuàng)建好的data目錄的路徑}</dataDir>
? ??????????????


? ? ? ? ? ? 5)、拷貝下載文件夾中的webapp下的工程到TOMCAT的webapp下

? ??????????復(fù)制到

????????????6)、拷貝下載文件夾中solr壓縮包中server\lib\ext中的jar全部復(fù)制到Tomcat\ webapps\solr\WEB-INF\lib目錄中
????????????7)、拷貝下載文件夾中solr壓縮包中server\lib\metrics*中的jar全部復(fù)制到Tomcat\ webapps\solr\WEB-INF\lib目錄中
????????????8)、拷貝下載文件夾中solr壓縮包中dist\dataimporthandler*中的jar全部復(fù)制到Tomcat\ webapps\solr\WEB-INF\lib目錄中
????????????9)、在Tomcat的\ webapps\solr\WEB-INF\下建立classes目錄,并將solr/server/resources/log4j.properties文件復(fù)制其中;
????????????10)、編輯webapps/solr/WEB-INF/下的web.xml文件:
? ? ? ? ? ? 配置solr下core路徑,找到如下內(nèi)容,并去掉注釋


? ??????????????????注釋標(biāo)簽以及標(biāo)簽下的內(nèi)容

? ? ? ? ? ? ? ? 11)、修改/core/conf/managed-schema添加兩種域類型(123行左右):

? ? ? ? ? ? ? ? 12)、在D:\apache-tomcat-8.5.13\webapps\solrhome\core路徑下創(chuàng)建core.properties文件,里面配置solr環(huán)境

? ??????????????啟動管理后臺:啟動tomcat后,訪問http://localhost: 8080/solr/index.html
? ? ? ? ? ? ? ? 通過core Admin來進行core的添加,同時查看添加的core內(nèi)容。
solr控制臺

分詞器
????????準(zhǔn)分詞器對中文分詞不太好用,一般建議用IKAnalyzer,該分詞器對中文的支持應(yīng)該是目前最好的,拷貝IKAnalyzer.jar文件到solr/WEB-INF/lib下,將IKAnalyzer.cfg.xml、ext_stopword.dic、mydict.dic拷貝到solr/WEB-INF/classes下.
????????在core/conf/managed-schema文件中添加:

????????添加完成后,就可以進solr admin里面試試選擇text_ik,看看效果,如果測試效果沒有問題,那么就可以對managed-schema文件中,需要用到該分詞的域進行修改或者添加了
? ??????重啟solr后進入控制臺可以看見solr分詞器,里面多了IK分詞器選項,如下所示

? ??????選擇IK分詞器進行分詞操作,如下所示

外部數(shù)據(jù)導(dǎo)入
? ? ? ? 1)、如果導(dǎo)入的數(shù)據(jù)為mysql數(shù)據(jù)庫的表數(shù)據(jù),那么還需要導(dǎo)入mysql的jar包到solr項目下的lib中:

? ? ? ? 2)、在solrconfig.xml文件中加入:

? ? ? ? 3)、修改solrhome/core/conf/solrconfig.xml文件,找到requestHandler標(biāo)簽,在其結(jié)束標(biāo)簽后面添加一組新的標(biāo)簽:

? ? ? ? 4)、在solrhome/core/conf/目錄下創(chuàng)建上述配置內(nèi)容中的data-config.xml文件,文件內(nèi)容如下:

? ??????上面的配置中可以看到從數(shù)據(jù)庫中對應(yīng)映射了一張表名為blog的表,其中deltaQuery是增量索引,原理是從數(shù)據(jù)庫中根據(jù)deltaQuery指定的SQL語句查詢出所有需要增量導(dǎo)入的數(shù)據(jù)的wzid號。然后根據(jù)deltaImportQuery指定的SQL語句返回所有這些wzid的數(shù)據(jù),即為這次增量導(dǎo)入所要處理的數(shù)據(jù)。核心思想是:通過內(nèi)置量“${dih.delta.id}”和“${dataimporter.last_index_time}”來記錄本次要索引的wzid和最近一次索引的時間,同時映射了4個字段。
? ? ? ? 5)、那么我們這個時候就需要對managed-schema文件再次進行修改,把上述標(biāo)簽中的name屬性,映射到新的field中,如下:

? ??????修改<field name=”id”>標(biāo)簽內(nèi)容:
? ? ? ? <field name="id" type="string" indexed="true" stored="true" required="true">
? ??????重啟solr后,進入到導(dǎo)入數(shù)據(jù)的界面

? ??????此界面的功能不在此介紹了,點擊執(zhí)行按鈕,導(dǎo)入完數(shù)據(jù)后,可以在查詢頁面看到數(shù)據(jù)存在了,如下所示:

? ? ? ? 2)、通過java代碼導(dǎo)入數(shù)據(jù)
? ??????????實際上大部分的需求都是需要結(jié)合代碼進行導(dǎo)入數(shù)據(jù),比較不可能每次導(dǎo)入數(shù)據(jù)的時候都需要人工手動去solr控制臺界面中進行操作,所以我們要定時去導(dǎo)入數(shù)據(jù)。
? ??????????首先需要有一個javaBea和solr中的約束文件中新增的屬性一 一對應(yīng),如下為javabean

? ??????注意,每個字段的set方法中需要加入solr的字段對應(yīng)注解,所以我們需要在項目中導(dǎo)入solr相關(guān)的jar包

? ??????然后通過定時器去導(dǎo)入對應(yīng)數(shù)據(jù)到solr中,此處用到的是spring4.0新特性進行演示,原理都差不多,所以只需要能實現(xiàn)定時器任務(wù)即可
? ??????創(chuàng)建了全局配置文件,類似于application.xml文件,開啟了定時器任務(wù)支持等注解

????????最后在對應(yīng)的定時任務(wù)類中完成任務(wù)


? ??????????????直接啟動web項目定時器即可執(zhí)行
solr控制臺查詢界面介紹




Solr結(jié)合Web項目實現(xiàn)高亮查詢
? ??????????需求:在項目中需要根據(jù)關(guān)鍵字搜索出對應(yīng)的文章的標(biāo)題和內(nèi)容。
????????????前提:基于剛才已經(jīng)導(dǎo)入的數(shù)據(jù)。
????????????Java代碼如下:




? ??????項目運行后,如下所示,會展示所有的文章帖子:

????????點擊搜索,輸入“mysql集群 環(huán)境”

? ??????結(jié)果:
