前段時(shí)間自己簡(jiǎn)單的學(xué)習(xí)了一下Elasticsearch,但是我們目前開(kāi)發(fā)項(xiàng)目中其實(shí)使用的還是solr,自己之前雖然也接觸過(guò)solr,但是并沒(méi)有系統(tǒng)的學(xué)習(xí)過(guò),所以這次準(zhǔn)備系統(tǒng)的學(xué)習(xí)一下。另外我看到網(wǎng)上很多solr服務(wù)都是和tomcat整合使用的,這點(diǎn)我確實(shí)不太理解(solr是個(gè)web項(xiàng)目沒(méi)錯(cuò),但是沒(méi)感覺(jué)到它需要基于tomcat來(lái)使用),這次自己也是單獨(dú)使用solr的,沒(méi)有和tomcat做整合。
一、安裝
首先下載solr,下載地址,然后選擇相應(yīng)的目錄,我本地安裝位置:
/home/ypcfly/ypcfly/software/solr/solr-7.5.0
// 常用命令
./solr start
./solr restart
./sorl stop
解壓以后直接進(jìn)入到安裝路徑下的bin目錄,執(zhí)行啟動(dòng)命令啟動(dòng)solr服務(wù),啟動(dòng)成功后,打開(kāi)瀏覽器訪問(wèn):
localhost:8983/solr

表示服務(wù)器已經(jīng)成功啟動(dòng)了,接下來(lái)我們需要?jiǎng)?chuàng)建一個(gè)core,一個(gè)solr服務(wù)是可以有多個(gè)core的,創(chuàng)建core可以直接通過(guò)命令創(chuàng)建
./solr create –c "core name"
也可以通過(guò)后臺(tái)管理頁(yè)面手動(dòng)創(chuàng)建。先進(jìn)入到 /home/ypcfly/ypcfly/software/solr/solr-7.5.0/server/solr目錄下,創(chuàng)建一個(gè)文件夾"custom_core",并復(fù)制同目錄下的configsets文件夾下的"conf"文件夾到"custom_core",然后進(jìn)入solr的后臺(tái)管理頁(yè)面,如下圖:

如果創(chuàng)建過(guò)程中出錯(cuò),按照錯(cuò)誤信息提示修改就可以了,這個(gè)過(guò)程還是很簡(jiǎn)單的。最后在"core selector"下可以選擇自己的core,并進(jìn)行其他的操作,到這里solr的安裝以及core的創(chuàng)建就完成了。
二、數(shù)據(jù)導(dǎo)入
core創(chuàng)建好了之后,solr還沒(méi)有數(shù)據(jù),所以需要從數(shù)據(jù)庫(kù)批量添加數(shù)據(jù)到solr服務(wù)器。數(shù)據(jù)導(dǎo)入可以通過(guò)solr后臺(tái)管理頁(yè)面導(dǎo)入,也可以通過(guò)代碼操作solr客戶(hù)端導(dǎo)入,這里就簡(jiǎn)單的通過(guò)后臺(tái)管理頁(yè)面導(dǎo)入數(shù)據(jù)。先選擇需要導(dǎo)入數(shù)據(jù)的core,然后選擇Dataimport,如下圖:

但是,在導(dǎo)入之前我們還有兩個(gè)很重要的事情需要處理:一是配置導(dǎo)入數(shù)據(jù)需要的處理器;二是配置數(shù)據(jù)源。
1、配置導(dǎo)入數(shù)據(jù)處理器
打開(kāi) /home/ypcfly/ypcfly/software/solr/solr-7.5.0/server/solr/cutom_core/conf/solrconfig.xml文件,添加導(dǎo)入數(shù)據(jù)處理器,這個(gè)和其他的處理器放在一起就可以了。
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
//配置文件的路徑應(yīng)該也可以使用絕對(duì)路徑
<str name="config">dataConfig.xml</str>
</lst>
</requestHandler>
2、配置數(shù)據(jù)源
然后在conf文件夾下新建一個(gè)dataConfig.xml文件(名字自己隨意取,只需要和上面solrconfig配置中的名稱(chēng)一致即可),并配置數(shù)據(jù)源和相關(guān)的document,也就是需要導(dǎo)入的數(shù)據(jù)。solr的數(shù)據(jù)源是支持多個(gè)數(shù)據(jù)庫(kù)的,比方我可以使用mysql的user表,同時(shí)使用postgresql的order表,只是相對(duì)復(fù)雜一點(diǎn),多庫(kù)的情況個(gè)人感覺(jué)應(yīng)該很少見(jiàn)。具體可以見(jiàn)solr官方文檔,我依然使用的是postgresql數(shù)據(jù)庫(kù),其他數(shù)據(jù)庫(kù)一樣的格式。這里我document配置了最簡(jiǎn)單的單表查詢(xún)。entity就是我們的"實(shí)體",column就是表的列名,name是對(duì)應(yīng)的solr的Field。
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource
driver="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/springboot"
user="postgres" password="123456"/>
<document>
<entity name="user" query="select * from t_user">
<field column="id" name="id"/>
<field column="username" name="userName"/>
<field column="age" name="userAge"/>
<field column="sex" name="sex"/>
<field column="address" name="address"/>
<field column="mobile" name="mobile"/>
<field column="description" name="description"/>
</entity>
</document>
</dataConfig>
數(shù)據(jù)源的配置文件配置好以后,需要將數(shù)據(jù)庫(kù)查詢(xún)的column的名字和solr中Field的名字對(duì)應(yīng)起來(lái),所以還需要在schema配置文件添加相關(guān)的Field,打開(kāi)conf下面的managed-schema文件,添加相應(yīng)的Field。
<!-- 自定義添加filed -->
<field name="userName" type="string" indexed="true" stored="true"/>
<field name="userAge" type="pint" indexed="true" stored="true"/>
<field name="sex" type="string" indexed="true" stored="true"/>
<field name="mobile" type="string" indexed="true" stored="true"/>
<field name="address" type="string" indexed="true" stored="true"/>
<field name="description" type="string" indexed="true" stored="true"/>
自定義Field的類(lèi)型必須是solr已有的類(lèi)型,indexed表示改字段是否支持索引,stored表示是否會(huì)存儲(chǔ)。至于為什么我沒(méi)添加id,那是因?yàn)閟olr已經(jīng)有了id字段,所以不需要用戶(hù)再去定義了。
最后一個(gè)是導(dǎo)入相關(guān)的jar包,因?yàn)閿?shù)據(jù)導(dǎo)入我們使用到了數(shù)據(jù)庫(kù),所以必須要有數(shù)據(jù)庫(kù)驅(qū)動(dòng)的jar,另一個(gè)就是solr自帶的data-import的jar。數(shù)據(jù)庫(kù)驅(qū)動(dòng)根據(jù)自己數(shù)據(jù)庫(kù)選擇,而solr自帶的兩個(gè)相關(guān)jar包,可以在solr解壓目錄"dist"目錄下找到,而我本地路徑:
/home/ypcfly/ypcfly/software/solr/solr-7.5.0/dist
一個(gè)是solr-dataimporthandler-7.5.0.jar,另一個(gè)是solr-dataimporthandler-extras-7.5.0.jar。將這三個(gè)jar包復(fù)制到"../server/solr-webapp/webapp/WEB-INF/lib"文件夾下。
然后重新啟動(dòng)solr服務(wù)器。
3、數(shù)據(jù)導(dǎo)入
啟動(dòng)好solr服務(wù)器后,打開(kāi)solr后臺(tái)管理頁(yè)面,選擇"Dataimport",勾選上"圖-3"中的"Clean"和"Commit",然后點(diǎn)擊"Excute"執(zhí)行成功后,在點(diǎn)擊旁邊的"Refresh status",如果報(bào)錯(cuò)的話(huà)根據(jù)報(bào)錯(cuò)信息進(jìn)行排除即可。然后我們查詢(xún)一下數(shù)據(jù)是不是真的導(dǎo)入成功,選擇查詢(xún)所有數(shù)據(jù),看結(jié)果是否一致就可以了。

結(jié)果總共有4條記錄和我數(shù)據(jù)的數(shù)據(jù)完全一致,說(shuō)明數(shù)據(jù)導(dǎo)入成功了。
三、安裝IK分詞器
其實(shí)solr也好elasticsearch一般都會(huì)配置單獨(dú)的中文分詞器,根據(jù)需要可能會(huì)選IK或者pingyin,也可能都安裝,下面簡(jiǎn)單記錄下安裝IK中文分詞的過(guò)程。solr也是有自帶分詞器的,但是對(duì)中文支持并不好,所以都會(huì)需要安裝專(zhuān)門(mén)的中文分詞器。
1、配置IK
先根據(jù)自己solr版本下載相應(yīng)的IK分詞器包,下載地址。感覺(jué)solr版本的IK下載地址不太好找,不像Elasticsearch非常容易找到每個(gè)版本對(duì)應(yīng)的IK。下載的時(shí)候選擇jar格式,下載之后將jar包復(fù)制到"../server/solr-webapp/webapp/WEB-INF/lib"文件夾下,我的本地路徑是:
/home/ypcfly/ypcfly/software/solr/solr-7.5.0/server/solr-webapp/webapp/WEB-INF/lib
然后在WEB-INF文件夾下新建一個(gè)"classes"文件,復(fù)制IK分詞器需要的相關(guān)配置文件(我是從jar包解壓獲取的)到classes目錄下,其實(shí)主要就一個(gè),那就是"IKAnalyzer.cfg.xml",也就是IK的配置文件,內(nèi)容也不多,如果找不到直接復(fù)制就行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 擴(kuò)展配置</comment>
<!--用戶(hù)可以在這里配置自己的擴(kuò)展字典 -->
<entry key="ext_dict">custom.dic;</entry>
<!--用戶(hù)可以在這里配置自己的擴(kuò)展停止詞字典-->
<entry key="ext_stopwords">stopword.dic;</entry>
</properties>
在上面的配置文件中我已經(jīng)自定義了我的用戶(hù)詞典,當(dāng)然還沒(méi)用配置相關(guān)的詞。用戶(hù)詞典應(yīng)該也可以配置遠(yuǎn)程字典的,但是這里不知道為什么沒(méi)有。
2、配置schema
這里我們需要打開(kāi)"core"/conf目錄下的"managed-schema"文件,然后添加上IK的分詞器的配置內(nèi)容:
<fieldType name="ik_word" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
名字自己隨意就好了,到這里關(guān)于IK分詞器的整個(gè)配置就完成了,接下來(lái)使用IK分詞器測(cè)試一下
3、測(cè)試
配置IK完成后啟動(dòng)solr服務(wù)器,選擇自定義的core,選擇"Analysis",隨意輸入一段中文,然后選擇到"ik_word"(和上面managed-schema配置中自己定義名稱(chēng)一致),點(diǎn)擊右側(cè)"Analyse Values",結(jié)果如下:

這個(gè)時(shí)候我自定義的用戶(hù)字典還每沒(méi)添加任何的詞語(yǔ),但是根據(jù)結(jié)果也看出來(lái),其實(shí)IK已經(jīng)幫我們做了一些分詞了,只是效果比較差,更多的還是一個(gè)一個(gè)的漢字,下面是分詞結(jié)果:
嵎 山金 金碧 有 光輝 遷 停車(chē) 車(chē)馬 正 輕 肥 彌 思 王 褒 擁 節(jié) 去 復(fù) 憶 相 如 乘 傳 歸 君 平 子 云 寂 不 嗣 江漢 漢英 英靈 已 信 稀
這是IK默認(rèn)的分詞效果,現(xiàn)在我們使用我們自己的那字典,然后再測(cè)試一下。先進(jìn)入相關(guān)的文件夾,即
/home/ypcfly/ypcfly/software/solr/solr-7.5.0/server/solr-webapp/webapp/WEB-INF/classes
打開(kāi)自定義的字典文件custom.dic,并添加幾個(gè)詞語(yǔ),我添加的詞語(yǔ)如下:
嵎山 正輕肥 彌思王褒 復(fù)憶 乘傳歸 君平子云 已信稀
也就是說(shuō)這些詞會(huì)被solr單獨(dú)分出來(lái)作為一個(gè)不可分的最小單元,完成后重新啟動(dòng)solr再測(cè)試一次,結(jié)果如下:

相比第一次沒(méi)添加的時(shí)候已經(jīng)好些了,整個(gè)分詞結(jié)果如下:
嵎山 山金 金碧 有 光輝 遷 停車(chē) 車(chē)馬 正輕肥 彌思王褒 擁 節(jié) 去 復(fù)憶 相 如 乘傳歸 君平子云 寂 不 嗣 江漢 漢英 英靈 已信稀
通過(guò)兩次分詞結(jié)果對(duì)比很直觀的就發(fā)現(xiàn),自定義字典里的詞都已經(jīng)分出來(lái)了,但是感覺(jué)效果還是不太好,我記得IK應(yīng)該是可以指定最大分詞和最小分詞的,但是和solr的整合中自己還沒(méi)有發(fā)現(xiàn)這個(gè)功能。
好了,這次關(guān)于solr的入門(mén)學(xué)習(xí)先到這里,關(guān)于solr的一些基本操作下次再繼續(xù)學(xué)習(xí)吧,到時(shí)候可以通過(guò)一個(gè)簡(jiǎn)單的demo,學(xué)習(xí)一下如何在代碼中使用solr。