一个非常hao用的elasticsearch中文分词器插件 HaoAnalyzer

首先上地址

elasticsearch (es) hao 分词器 中文分词器
elasticsearch-analysis-hao

ES HAO 分词器

简介

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

主要参考了 IKHanLP
其中有的源码是直接搬运的。
相比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 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_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": "奋发图强打篮球有利于提高人民生活,有的放矢,中华人民共和国家庭宣传委员会宣。🐶"
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271