一、什麼是分詞
首先,Solr有自己基本的類型,string、int、date、long等等。
對于string類型,比如在你的core/conf/manage-schema檔案中,配置一個字段類型為string類型,如果查詢符合“我是中國人”的資料,它就認為“我是中國人”是一個詞語。
但是如果你将該字段設定成了分詞,即配置成了text_ik類型,就可能比對“我”、“中國人”、“中國”、“中”、“人”帶有這些字的該字段資料都可能被查詢到。這就是分詞帶來的結果。具體要按照各自的業務來配置是否分詞,分詞對于大文本字段設定是合理的,但是對于小字段,設定分詞是沒必要的,甚至有相反的結果。比如你的某一個叫姓名的字段設定了分詞,還不如設定string,查詢時模糊比對效果最好,(模糊比對就是查詢條件兩邊加上*),當然也要看自己業務需求是什麼。
二、配置目地
就是讓solr能對中文進行分詞
三、分詞器的選擇
之前我們使用jieba分詞,效果不是很好。
現在有個非常牛的分詞器,IK 分詞器,效果非常好,如果你一直使用solr 那麼以後将一直使用IK分詞器
中文分詞在solr裡面是沒有預設開啟的,需要自己配置一個中文分詞器。
目前可用的分詞器有smartcn,IK,Jeasy,庖丁。其實主要是兩種,一種是基于中科院ICTCLAS的隐式馬爾科夫HMM算法的中文分詞器,如smartcn,ictclas4j,優點是分詞準确度高,缺點是不能使用使用者自定義詞庫;另一種是基于最大比對的分詞器,如IK ,Jeasy,庖丁,優點是可以自定義詞庫,增加新詞,缺點是分出來的垃圾詞較多。各有優缺點。
主流還是ik,可以擴充自己的詞庫,非常友善,加入一些熱搜詞,主題詞,對于搜尋而言,非常友善
四、分詞器的的配置
4.1 下載下傳
下載下傳ik (5及以上版本通用)
4.2 解壓檔案及說明
ext.dic自定義詞 如沙雕 在漢語裡面不是一個詞 ,它隻是一個網絡用語,可以配置到這=裡面讓它成為一個詞
stopword.dic 停止字典 如 啊 吧 唉 不作分詞
IKAnalyzer.cfg.xml配置ik的配置檔案 不用改
Jar:如果要使用ik分詞要導入的jar包
4.3 修改managed-schema
UseSmart 和分詞的粒度相關:
False: 分詞的粒度大,一句話裡面分的詞語少
True:分詞的粒度細,一句話裡面分的詞語多
那我們在導入時需要的關鍵字多嗎?讓索引的資料量少一點。我們的粒度大:False
我們在搜尋時需要的關鍵字多嗎?我們想盡可能的覆寫所有的範圍,我們的粒度要細:True
<!--添加一個中文分詞器IK-->
<fieldType name="text_cn" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
</analyzer>
</fieldType>
4.4 把修改managed-sahma覆寫到solr
4.5 重新開機solr
4.6 檢視分析出現錯
産生原因是因為我們隻添加發分詞
但是ik想要運作必須要加入相關的配置
上面的配置沒有加入
4.7 把IK的配置入到solr
4.7.1,放入jar包
4.7.2,放配置
在/usr/local/solr-7.7.2/server/solr-webapp/webapp/WEB-INF建立一個classes
4.8,重新開機solr分析
4.9存在問題
要索引時要遵循一個原因
1,索引時分詞的要盡量少
2,搜尋時分詞盡量多
改完重新覆寫,重新開機測試
到此為止,全部配置成功!!!
五、使用IK分詞器
5.1 添加一個屬性
添加資料測試下
檢視分詞
查詢測試