首先上地址

elasticsearch-analysis-hao

HAO ES 分词器

简介

如何开发一个ES分词插件请参考 这里

次要参考了 IK 和 HanLP
其中有的源码是间接搬运的。
相比IK,比IK更智能,更精确,更快。
相比HanLp,比HanLP更轻量,分词更可控,没有一些智能的预测性能,并且HanLP也没有官网的ES插件。

次要是IK ik_max_word是穷举所有可能词,导致搜寻一些不相干的也会被搜到。

任性激动过分词后果竟然有任性 性冲动 动过,那么搜性冲动就会把这个doc搜寻到。

南京市长江大桥,后果是南京市 市长 长江大桥,那么搜市长会把这个doc搜寻到。
HanLPDijkstraSegment抄了过去,同时做了一些优化。

  1. 依据词频计算最短路,穷举出可能的词,而不是所有的词,如果穷举的词不对,能够调词频来纠正。
  2. 反对emoji。
  3. 反对元词,比方俄罗斯不会再拆分成斯(罗斯是罕用人名)。这样搜罗斯就不会把俄罗斯相干文档召回

不反对词性

提供
Analyzer: hao_search_mode, hao_index_mode
Tokenizer: hao_search_mode, hao_index_mode

Versions

Git tagES version
masterES最新稳定版
v7.7.17.7.1
vX.Y.ZX.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_modefalsehao_index_modetrue,细颗粒度适宜Term Query,粗颗粒度适宜Phrase查问
enableFallBack如果分词报错,是否启动最细粒度分词,即按字分。倡议search_mode应用,不至于影响用户搜寻。index_mode不启动,以便及时报错告警告诉。false不启动降级
enableFailDingMsg是否启动失败钉钉告诉,告诉地址为HttpAnalyzer.cfg.xmldingWebHookUrl字段。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": "奋发图强打篮球有利于进步人民生存,对症下药,中华人民共和国家庭宣传委员会宣。????"}