首先上地址
elasticsearch (es) hao 分詞器 中文分詞器
elasticsearch-analysis-hao
ES HAO 分詞器
簡介
如何開發(fā)一個ES分詞插件請參考 這里
主要參考了 IK 和 HanLP
其中有的源碼是直接搬運的。
相比IK,比IK更智能,更準確,更快。
相比HanLp,比HanLP更輕量,分詞更可控,沒有一些智能的預測功能,并且HanLP也沒有官方的ES插件。
主要是IK ik_max_word是窮舉所有可能詞,導致搜索一些不相關的也會被搜到。
任性沖動過分詞結果居然有任性 性沖動 動過,那么搜性沖動就會把這個doc搜索到。
南京市長江大橋,結果是南京市 市長 長江大橋,那么搜市長會把這個doc搜索到。
把HanLP的 DijkstraSegment抄了過來,同時做了一些優(yōu)化。
根據(jù)詞頻計算最短路,窮舉出可能的詞,而不是所有的詞,如果窮舉的詞不對,可以調詞頻來糾正。
支持emoji。
支持元詞,比如
俄羅斯不會再拆分成俄和羅斯(羅斯是常用人名)。這樣搜羅斯就不會把俄羅斯相關文檔召回
不支持詞性
提供
Analyzer: hao_search_mode, hao_index_mode
Tokenizer: hao_search_mode, hao_index_mode
Versions
| Git tag | ES version |
|---|---|
| master | ES最新穩(wěn)定版 |
| v7.7.1 | 7.7.1 |
| vX.Y.Z | X.Y.Z |
使用
安裝
方式1. bin/elasticsearch-plugin install file:///Users/xiaoming/Download/analysis-hao.zip
方式2. 解壓后,放在es plugins目錄即可。
最后重啟ES
ES 版本升級
如果沒有你需要的對應ES版本,修改pom.xml->elasticsearch.version的值為對應版本,然后執(zhí)行
mvn clean package -Dmaven.test.skip=true,就可以得到插件的zip安裝包。
自定義分詞器
下面是自定義分詞器可用的配置項
| 配置項參數(shù) | 功能 | 默認值 |
|---|---|---|
enableIndexMode |
是否使用index模式,index模式為細顆粒度。 |
hao_search_mode為false,hao_index_mode為true,細顆粒度適合Term Query,粗顆粒度適合Phrase查詢 |
enableFallBack |
如果分詞報錯,是否啟動最細粒度分詞,即按字分。建議search_mode使用,不至于影響用戶搜索。index_mode不啟動,以便及時報錯告警通知。 |
false不啟動降級 |
enableFailDingMsg |
是否啟動失敗釘釘通知,通知地址為HttpAnalyzer.cfg.xml的dingWebHookUrl字段。 |
false |
enableSingleWord |
是否使用細粒度返回的單字。比如體力值,分詞結果只存體力值,體力,而不存值
|
false |
HaoAnalyzer.cfg.xml 配置
| 參數(shù) | 功能 | 備注 |
|---|---|---|
baseDictionary |
基礎詞庫文件名 | 放在插件config目錄或者es的config目錄,不用更改 |
customerDictionaryFile |
用戶自定義遠程詞庫文件 | 會存儲在插件config目錄或者es的config目錄 |
remoteFreqDict |
遠程用戶自定義詞庫文件 | 方便熱更新,熱更新通過下面兩個參數(shù)定時更新。 |
syncDicTim |
遠程詞庫第一次同步時間 hh:mm:ss
|
- |
syncDicPeriodTime |
遠程詞庫同步時間間隔,秒 | 比如 syncDicTime=20:00:00,syncDicPeriodTime=86400,則是每天20點同步 |
dingWebHookUrl |
釘釘機器人url | 用于分詞異常,同步詞庫異常/成功通知 |
dingMsgContent |
機器人通知文案 | 注意配置釘釘機器人的時候關鍵詞要和這個文案匹配,不然會消息發(fā)送失敗 |
詞庫說明
優(yōu)先讀取
{ES_HOME}/config/analysis-hao/目錄,沒有讀取{ES_HOME}/plugins/analysis-hao/config目錄下的文件
- 基礎詞庫
基礎詞庫是base_dictionary.json,是一個json文件,key為詞,value為詞頻(int)。是可以修改的,可以添加詞,可以修改詞頻。
例如:奮發(fā)圖強分詞結果是奮,發(fā)圖,強, 是因為發(fā)圖這個詞的詞頻太高了(因為出現(xiàn)次數(shù)高),則可以降低詞頻,手動修改base_dictionary.json文件就好了。 - 遠程詞庫
用戶自定義詞庫會按照配置的時間和周期定期執(zhí)行。
從遠程詞庫更新完成后會自動覆蓋現(xiàn)在的customerDictionaryFile。
遠程詞庫的文件格式每行格式為{詞},{詞頻},{是否元詞}, 例如俄羅斯,1000,1。
是否元詞字段解釋:
1代表是元詞,不會再細拆分,俄羅斯不會再拆分成俄和羅斯(羅斯是常用人名)。這樣搜羅斯就不會把俄羅斯相關文檔召回。
0就是可以繼續(xù)細拆分,比如奮發(fā)圖強
示例索引demo
建索引:
PUT test/
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"search_analyzer": {
"filter": [
"lowercase"
],
"char_filter": [
"html_strip"
],
"type": "custom",
"tokenizer": "my_search_token"
},
"title_analyzer": {
"filter": [
"lowercase"
],
"char_filter": [
"html_strip"
],
"type": "custom",
"tokenizer": "my_title_index_token"
}
},
"tokenizer": {
"my_title_index_token": {
"enableOOV": "false",
"enableFailDingMsg": "true",
"type": "hao_index_mode",
"enableSingleWord": "true",
"enableFallBack": "true"
},
"my_search_token": {
"enableOOV": "false",
"enableFailDingMsg": "true",
"type": "hao_search_mode",
"enableSingleWord": "true",
"enableFallBack": "true"
}
}
},
"number_of_replicas": "0"
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"index_options": "offsets",
"analyzer": "title_analyzer",
"search_analyzer": "search_analyzer"
}
}
}
}
測試分詞
test/_analyze
{
"analyzer": "title_analyzer",
"text": "奮發(fā)圖強打籃球有利于提高人民生活,有的放矢,中華人民共和國家庭宣傳委員會宣。??"
}
test/_analyze
{
"analyzer": "search_analyzer",
"text": "奮發(fā)圖強打籃球有利于提高人民生活,有的放矢,中華人民共和國家庭宣傳委員會宣。??"
}