大綱
一、elasticsearch6 ansj分詞簡介
二、elasticsearch6 ansj分詞安裝
三、elasticsearch6 ansj分詞配置
四、elasticsearch6 ansj分詞使用
五,總結
一 ansj介紹
nsj_seg分詞器個人覺得是開源分詞器裏最強悍功能最豐富的。ansj_seg基於中科院的 ictclas 中文分詞算法,智能、高效。雖然現在已經有ictclas 的for java版本,但是 ansj_seg從實現到使用來說要強大的多,很多細節和小功能都有考慮,在索引和自然語言分析方面都有很優秀的表現。ansj_seg可以作爲ictclas 算法實現的分詞器的代表。
ansj分詞插件的說明
es5.0版本之前配置ansj均是在elasticsearch.yml中配置
es5.0版本及之後,均不支持配置文件方式,僅支持api方式進行設置
ansj分詞插件的安裝
分詞插件的下載
從github開源網址下載
https://github.com/NLPchina/elasticsearch-analysis-ansj/releases/download/v6.2.2/elasticsearch-analysis-ansj-6.2.2.0-release.zip
二 ansj分詞安裝
分詞插件的配置步驟
1 將下載下來的zip包,拷貝到es_home/plugins下
2 將zip解壓到當前目錄下
3 將之前的es-ansj的zip包刪除掉。
4 重啓es(使之加載分詞器配置,使之具備分詞的能力,此時還不能生效和使用)
三 ansj分詞配置
通過es提供的api方式配置ansj分詞插件
1、首先關閉索引服務(分詞配置不支持動態設置,須關閉索引服務後纔可以進行設置分詞)
curl -XPOST ‘127.0.0.1:9200/_all/_close’
2、設置分詞方式
curl -XPUT 'http://127.0.0.1:9200/_all/_settings?preserve_existing=true' -H 'Content-Type: application/json' -d '{
"index.analysis.analyzer.default.type" : "index_ansj",
"index.analysis.analyzer.default_search.type" : "query_ansj"
}'
4 關於分詞方式的說明、
索引分詞
儘可能分出所有的分詞結果,儘量提高召回率
召回率
官方定義:搜索結果的正確內容條目佔文檔中所有相關內容條目的比例
白話解釋:應該被搜索出來的東西,儘可能都被搜索出來,即hit命中的比例
搜索分詞
一定是索引分詞的一個子集,儘量保證準確率
5 準確率
官方定義:搜索結果中的正確內容條目佔搜索出來的內容條目的比例
白話解釋:儘量保證搜索出來的內容條目,對的越多越好。
6 打開索引服務,對外正常提供搜索服務
curl -XPOST ‘127.0.0.1:9200/_all/_open’
7 ansj分詞插件安裝成功後的測試
web http請求接口說明
/_cat/ansj: 執行分詞
/_cat/ansj/config: 顯示全部配置
/_ansj/flush/config: 刷新全部配置
/_ansj/flush/dic: 更新全部詞典。包括用戶自定義詞典,停用詞典,同義詞典,歧義詞典,crf
web http請求接口測試
http://127.0.0.1:9200/_cat/ansj?text=長春市長春節講話&type=index_ansj
問題發現
索引分詞效果並不理想,分的不夠細,會直接影響搜索效果。
主要原因:開源版es-ansj分詞的配置有bug,沒有加載完全詞庫導致的。
解決方法
a、下載ansj分詞最新版,獲取其最新分詞庫和配置文件
下載地址-1:https://github.com/NLPchina/ansj_seg/releases,找最新版即可
不知道是什麼原因,半天沒下下來。可以在git上只下載需要的文件即可。
b、解壓縮後,拿到其library目錄和ansj_library.properties文件
c、將如上2個文件,拷貝到es_home根目錄下
d、重啓es即可生效
web http請求接口再測試,依然以之前的示例作爲比較,即可獲取理想的索引和搜索分詞的效果。
四 ansj分詞使用
es-ansj插件使用介紹
通過head新建一個索引以及一個類型的mapping結構,並指定相關字段的分詞設置
原生結構
curl -XPUT http://localhost:9200/test -H 'Content-Type: application/json' -d '{
"settings" : {
"number_of_shards" : 1,
"number_of_replicas" : 0
},
"mappings" : {
"student" : {
"_all" : { "enabled" : false },
"properties" : {
"name" : { "type" : "text", "analyzer" : "index_ansj", "search_analyzer" : "query_ansj" },
"classname" : { "type" : "text", "analyzer" : "index_ansj", "search_analyzer" : "query_ansj" },
"gender" : { "type" : "text" }
}
}
}
}'
通過head複合頁面發送請求
{
"settings" : {
"number_of_shards" : 1,
"number_of_replicas" : 0
},
"mappings" : {
"student" : {
"_all" : { "enabled" : false },
"properties" : {
"name" : { "type" : "text", "analyzer" : "index_ansj", "search_analyzer" : "query_ansj" },
"classname" : { "type" : "text", "analyzer" : "index_ansj", "search_analyzer" : "query_ansj" },
"gender" : { "type" : "text" }
}
}
}
}
通過head向指定索引名稱及其指定的type新建一條數據
原生結構
curl -XPUT 'http://localhost:9200/test/student/1?pretty' -H 'Content-Type: application/json' -d '
{
"name": "張自強",
"classname": "計算機科技技術1班",
"gender": "男生"
}'
通過head複合頁面發送請求
{
"name": "張自強",
"classname": "計算機科技技術1班",
"gender": "男生"
}
//第2名
{
"name": "李四",
"classname": "計算機科技技術2班",
"gender": "男生"
}
//第3名
{
"name": "張萌萌",
"classname": "軟件工程3班",
"gender": "女生"
}
五 總結
1 word分詞器
word分詞是一個Java實現的中文分詞組件,提供了多種基於詞典的分詞算法,並利用ngram模型來消除歧義。 能準確識別英文、數字,以及日期、時間等數量詞,能識別人名、地名、組織機構名等未登錄詞。 同時提供了Lucene、Solr、ElasticSearch插件。
可參考:
- http://my.oschina.net/apdplat/blog/228615?p=1 裏面對word分詞器介紹得很詳細
- word分詞器的主頁:https://github.com/ysc/word
2 ansj
ansj_seg分詞器個人覺得是開源分詞器裏最強悍功能最豐富的。ansj_seg基於中科院的 ictclas 中文分詞算法,智能、高效。雖然現在已經有ictclas 的for java版本,但是 ansj_seg從實現到使用來說要強大的多,而且作者自產自銷自用,很多細節和小功能都有考慮,在索引和自然語言分析方面都有很優秀的表現。ansj_seg可以作爲ictclas 算法實現的分詞器的代表出場。
可參考:
- ansj分詞器主頁 https://github.com/NLPchina/ansj_seg
- ansj_seg中文分詞實例 http://www.blogchong.com/post/78.html
3 IKanalyzer
IKanalyzer採用的是“正向迭代最細粒度切分算法”,是比較常見而且很容易上手的分詞器了。一般新手上路學習lucene或者solr都會用這個。優點是開源(其實java分詞器多是開源的,畢竟算法都是業內熟知的)、輕量、目前來看沒有太大的bug,源碼簡單易懂,做二次開發也很簡單,即使遇到solr/Lucene版本更新,只需要自己稍微修改下實現類就可以通用。缺點是過於簡單白癡,只是簡單的根據配置好的詞庫進行分詞,沒有任何智能可言,連“和服”、“和服務器”這種老梗都破不了。IKanalyzer 有兩種分詞類型。
ik_max_word:會將文本做最細粒度的拆分,會窮盡各種可能的組合;
ik_smart:會做最粗粒度的拆分。
IKanalyzer可以作爲非智能分詞器的代表出場。
可參考:
- IKanalyzer分詞代碼:http://git.oschina.net/wltea/IK-Analyzer-2012FF/tree/master
4 mmseg4j
mmseg4j用Chih-Hao Tsai 的MMSeg算法實現的中文分詞器,並實現lucene的analyzer和solr的TokenizerFactory以方便在Lucene和Solr中使用。 MMSeg 算法有兩種分詞方法:Simple和Complex,都是基於正向最大匹配。Complex加了四個規則過慮。
可參考:
5 jcseg
jcseg分詞器使用的是mmseg算法和fmm算法,這個分詞器類似ansj_seg的很多地方,智能、人性化,個人感覺體驗要超過同門師兄弟mmseg4j,所以可以作爲mmseg算法實現的分詞器的代表出場。
可參考:
參考文獻
https://blog.csdn.net/erliang20088/article/details/81627737
https://blog.csdn.net/liyantianmin/article/details/59485799
https://www.cnblogs.com/chenmc/p/9525163.html