首先上地址
elasticsearch-analysis-hao
HAO ES 分词器
简介
如何开发一个 ES 分词插件 请参考 这里
次要参考了 IK 和 HanLP
其中有的源码是间接搬运的。
相比 IK,比 IK 更智能,更精确,更快。
相比 HanLp,比 HanLP 更轻量,分词更可控,没有一些智能的预测性能,并且 HanLP 也没有官网的 ES 插件。
次要是 IK ik_max_word
是穷举所有可能词,导致搜寻一些不相干的也会被搜到。
任性激动过
分词后果竟然有 任性 性冲动 动过
, 那么搜 性冲动
就会把这个 doc 搜寻到。
南京市长江大桥
,后果是 南京市 市长 长江大桥
,那么搜 市长
会把这个 doc 搜寻到。
把 HanLP
的 DijkstraSegment
抄了过去,同时做了一些优化。
- 依据词频计算最短路,穷举出可能的词,而不是所有的词,如果穷举的词不对,能够调词频来纠正。
- 反对 emoji。
- 反对元词,比方
俄罗斯
不会再拆分成俄
和罗
斯(罗斯
是罕用人名)。这样搜罗斯
就不会把俄罗斯
相干文档召回
不反对词性
提供
Analyzer: hao_search_mode
, hao_index_mode
Tokenizer: hao_search_mode
, hao_index_mode
Versions
Git tag | ES version |
---|---|
master | ES 最新稳定版 |
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
的值为对应版本,而后执行 mvn clean package -Dmaven.test.skip=true
,就能够失去插件的zip
安装包。
自定义分词器
上面是自定义分词器可用的配置项
配置项参数 | 性能 | 默认值 |
---|---|---|
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 配置
参数 | 性能 | 备注 | |
---|---|---|---|
baseDictionary |
根底词库文件名 | 放在插件 config 目录或者 es 的 config 目录,不必更改 |
|
customerDictionaryFile |
用户自定义近程词库文件 | 会存储在插件 config 目录或者 es 的 config 目录 |
|
remoteFreqDict |
近程用户自定义词库文件 | 不便热更新,热更新通过上面两个参数定时更新。 | |
syncDicTim |
近程词库第一次同步工夫 hh:mm:ss |
– | |
syncDicPeriodTime |
近程词库同步工夫距离, 秒 | 比方 syncDicTime=20:00:00,syncDicPeriodTime=86400 ,则是每天 20 点同步 |
|
dingWebHookUrl |
钉钉机器人 url | 用于分词异样,同步词库异样 / 胜利告诉 | |
dingMsgContent |
机器人告诉文案 | 留神配置钉钉机器人的时候关键词要和这个文案匹配,不然会音讯发送失败 |
词库阐明
优先读取
{ES_HOME}/config/analysis-hao/
目录,没有读取{ES_HOME}/plugins/analysis-hao/config
目录下的文件
- 根底词库
根底词库是 base_dictionary.json
, 是一个 json 文件,key
为词,value
为词频(int
)。是能够批改的,能够增加词,能够批改词频。
例如:奋发图强
分词后果是 奋
, 发图
, 强
, 是因为 发图
这个词的词频太高了(因为呈现次数高),则能够升高词频,手动批改 base_dictionary.json
文件就好了。
- 近程词库
用户自定义词库会依照配置的工夫和周期定期执行。
从近程词库更新实现后会主动笼罩当初的 customerDictionaryFile
。
近程词库的文件格式 每行 格局为 {词},{词频},{是否元词}
, 例如 俄罗斯,1000,1
。
是否元词字段解释:1
代表是元词,不会再细拆分,俄罗斯
不会再拆分成 俄
和 罗斯
(罗斯是罕用人名)。这样搜 罗斯
就不会把 俄罗斯
相干文档召回。0
就是能够持续细拆分,比方 奋发图强
示例索引 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": "奋发图强打篮球有利于进步人民生存,对症下药,中华人民共和国家庭宣传委员会宣。????"
}
test/_analyze
{
"analyzer": "search_analyzer",
"text": "奋发图强打篮球有利于进步人民生存,对症下药,中华人民共和国家庭宣传委员会宣。????"
}