乐趣区

关于elasticsearch:elasticsearchanalysishao可能是东半球最好用的中文分词器

首先上地址

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 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": "奋发图强打篮球有利于进步人民生存,对症下药,中华人民共和国家庭宣传委员会宣。????"
}
退出移动版