功能概述

为了在 Elasticsearch 中获取更好的中文分词效果,ELK 集成了 IK Analysis 中文分词插件,并为该插件提供了结巴分词的词库和 IK 自带的搜狗词库,同时还支持用户上传自定义词典。IK Analysis 插件用法请参考 官方文档

本文为用户介绍 Elasticsearch API 的中文分词使用方式。

操作步骤

步骤一:上传字典文件

  1. 把自定义字典上传到可访问到的 HTTP 服务器上。本示例将通过如下命令行,将词典上传到某个 Logstash 节点,用户也可以上传至其他任意 Elasticsearch 节点可访问的 HTTP 服务器即可。

    curl -F "file=@-;filename=mydict.dic" $LS_IP/dicts/ <<- EOF
    云平台
    优帆科技
    优帆
    EOF
    说明

    URL最后的 / 不能省略。

  2. 上传成功后可通过访问 $LS_IP/dicts/mydict.dic 来查看上传的字典文件。

步骤二:修改配置参数

  1. 参考修改集群配置参数,修改 Elasticsearch 节点的 remote_ext_dict 参数为用户自定义字典的可访问 URL。

    如,此处,根据前文示例,可设置为

    http://$LS_IP/dicts/mydict.dic
  2. 重启 Elasticsearch 节点。

步骤三:测试中文分词

  1. 待 Elasticsearch 重启完成后,执行以下命令行,测试中文分词功能。

    INDEX=chinese-news # 可根据实际情况调整
    MAPPING_TYPE=_doc  # ELK 6.8.0 - QingCloud 2.1.0 以前版本请去掉开头的下划线,即:doc
    
    # 创建 $INDEX 索引
    curl -XPUT $ES_IP:9200/$INDEX; echo
    
    URL=$ES_IP:9200/$INDEX
    # ELK 6.8.6 及以下版本请使用如下地址
    # URL=$ES_IP:9200/$INDEX/$MAPPING_TYPE
    
    # 创建 mapping
    curl -s -H "Content-Type: application/json" $URL/_mapping -d'
    {
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_smart"
            }
        }
    }'; echo
    
    # 索引 一些 文档
    postData() {
      local url=$ES_IP:9200/$INDEX/$MAPPING_TYPE
      curl -H "Content-Type: application/json" -d'{"content":"'$1'"}' $url; echo
    }
    
    sampleData="
    美国留给伊拉克的是个烂摊子吗
    公安部:各地校车将享最高路权
    中韩渔警冲突调查:韩警平均每天扣1艘中国渔船
    中国驻洛杉矶领事馆遭亚裔男子枪击,嫌犯已自首
    北京优帆科技有限公司于2012年4月正式成立,是全球首家实现资源秒级响应并按秒计量的基础云服务商
    云平台的12字决:从初创企业到云生态的蜕变
    "
    
    for data in $sampleData; do postData "$data"; done
    
    # 高亮查询
    query() {
      curl -s -H "Content-Type: application/json" $ES_IP:9200/$INDEX/$MAPPING_TYPE/_search -d@- <<- EOF |
      {
          "query" : { "match" : { "content" : "$1" }},
          "highlight" : {
              "pre_tags" : ["<tag1>", "<tag2>"],
              "post_tags" : ["</tag1>", "</tag2>"],
              "fields" : {
                  "content" : {}
              }
          }
      }
    EOF
      grep --color "<tag1>[^<]*</tag1>"
    }
    
    words="
    中国
    云平台
    优帆科技
    "
    sleep 5; for word in $words; do query "$word"; done
  2. 查看中文分词结果,结果如下图红色部分所示即为成功。即 中国云平台优帆科技 被当做固定的中文分词表示。

    chinese_split
  3. 可根据实际需要随时更新用户自定义字典,Elasticsearch 会自动检测 HTTP 响应头中的 Last-Modified 和 ETag 的变化,来进行分词字典的热更新。