使用AliNLP分词插件(analysis-aliws)

AliNLP分词插件(analysis-aliws)是阿里云Elasticsearch(ES)自带的一个系统默认插件。安装该插件后会在阿里云ES中集成对应的分析器和分词器,可用于文档的分析和检索。您还可以通过该插件的词库配置功能实现词典的热更新。

插件介绍

安装analysis-aliws插件后,阿里云ES默认会集成以下分析器和分词器。您可以使用这些分析器和分词器查询文档,也可以通过词库配置功能自定义更新分词词库。

  • 分析器:aliws(不会截取虚词、虚词短语、符号)

  • 分词器:aliws_tokenizer

说明

前提条件

已安装analysis-aliws插件(默认未安装)。安装方法,请参见安装或卸载系统默认插件

使用限制

  • ES实例的内存要求8 GB及以上。如果内存不满足要求,请先升级集群,请参见升配集群

  • 5.x版本和8.x版本实例和内核增强版实例暂不支持安装analysis-aliws插件,请以控制台为准。

使用aliws分析器查询文档

  1. 登录目标阿里云Elasticsearch实例的Kibana控制台,根据页面提示进入Kibana主页。
    登录Kibana控制台的具体操作,请参见登录Kibana控制台
    说明 本文以阿里云Elasticsearch 6.7.0版本为例,其他版本操作可能略有差别,请以实际界面为准。
  2. 在左侧导航栏,单击Dev Tools
  3. Console中,执行如下命令创建索引。

    • 7.0以下版本

      PUT /index
      {
         "mappings": {
              "fulltext": {
                  "properties": {
                      "content": {
                          "type": "text",
                          "analyzer": "aliws"
                      }
                  }
              }
          }
      }
    • 7.0及以上版本

      PUT /index
      {
        "mappings": {
          "properties": {
              "content": {
                  "type": "text",
                  "analyzer": "aliws"
                }
            }
        }
      }

    以上示例创建了一个名称为index的索引,类型为fulltext(7.x版本为_doc)。包含了一个content属性,类型为text,并添加了aliws分析器。

    预期结果如下。

    {
      "acknowledged": true,
      "shards_acknowledged": true,
      "index": "index"
    }
  4. 执行如下命令,添加文档。

    重要

    如下命令仅适用于Elasticsearch 7.0以下版本,7.0及以上版本需要将fulltext修改为_doc

    POST /index/fulltext/1
    {
      "content": "I like go to school."
    }

    以上示例创建了名称为1的文档,并设置了文档中的content字段的内容为I like go to school.

    预期结果如下。

    {
      "_index": "index",
      "_type": "fulltext",
      "_id": "1",
      "_version": 1,
      "result": "created",
      "_shards": {
        "total": 2,
        "successful": 2,
        "failed": 0
      },
      "_seq_no": 0,
      "_primary_term": 1
    }
  5. 执行如下命令,查询文档。

    重要

    如下命令仅适用于Elasticsearch 7.0以下版本,7.0及以上版本需要将fulltext修改为_doc

    GET /index/fulltext/_search
    {
      "query": {
        "match": {
          "content": "school"
        }
      }
    }

    以上示例在所有fulltext类型的文档中,使用aliws分析器,搜索content字段中包含school的文档。

    预期结果如下。

    {
      "took": 5,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 0.2876821,
        "hits": [
          {
            "_index": "index",
            "_type": "fulltext",
            "_id": "2",
            "_score": 0.2876821,
            "_source": {
              "content": "I like go to school."
            }
          }
        ]
      }
    }
说明

如果您在使用analysis-aliws插件时,得到的结果不符合预期,可通过下文的测试分析器测试分词器排查调试。

配置词库

analysis-aliws插件支持词库配置,即上传自定义的词典文件aliws_ext_dict.txt。上传后节点能自动加载词典文件,实现词典的热更新操作(不会触发集群重启)。

说明
  • 安装analysis-aliws插件后,系统不会自带词典文件,需要您手动上传。

  • 在上传词典文件前,您需要先准备自定义的词典文件。词典文件要求如下:

    • 文件名:必须是aliws_ext_dict.txt。

    • 文件格式:必须是UTF-8格式。

    • 内容:每行一个词,前后不能有空白字符;需要使用UNIX或Linux的换行符,即每行结尾是\n。如果是在Windows系统中生成的文件,需要在Linux机器上使用dos2unix工具将词典文件处理后再上传。

  1. 登录阿里云Elasticsearch控制台
  2. 在左侧导航栏,单击Elasticsearch实例
  3. 进入目标实例。
    1. 在顶部菜单栏处,选择资源组和地域。
    2. Elasticsearch实例中单击目标实例ID。
  4. 在左侧导航栏,选择配置与管理 > 插件配置

  5. 系统默认插件列表中,单击analysis-aliws插件右侧操作列下的词库配置

  6. 词库配置页面下方,单击配置

  7. 选择词典文件的上传方式,并上传词典文件。

    • Text文件:单击上传txt文件,选择本地词典文件进行上传。

    • 添加OSS文件:输入Bucket名称和文件名称,单击添加

      请确保Bucket与阿里云Elasticsearch实例在同一地域。源端(OSS)的文件内容发生变化后,需要重新上传词典文件才能生效,不支持自动同步更新。

    说明

    analysis-aliws插件仅支持上传一个词典文件,如果您需要更新词典文件,可单击aliws_ext_dict.txt右侧的x图标,删除已上传的词典文件,重新上传词典文件。

  8. 单击保存

    保存后,不会触发集群重启,但会触发集群变更使词典文件生效,此过程需要10分钟左右。

    说明

    如果您需要获取已经上传过的词库文件,可在配置前单击对应文件的下载按钮图标进行下载。

测试分析器

执行如下命令,测试aliws分析器。

GET _analyze
{
  "text": "I like go to school.",
  "analyzer": "aliws"
}

预期结果如下。

{
  "tokens" : [
    {
      "token" : "i",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "like",
      "start_offset" : 2,
      "end_offset" : 6,
      "type" : "word",
      "position" : 2
    },
    {
      "token" : "go",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "word",
      "position" : 4
    },
    {
      "token" : "school",
      "start_offset" : 13,
      "end_offset" : 19,
      "type" : "word",
      "position" : 8
    }
  ]
}

测试分词器

执行如下命令,测试aliws_tokenizer分词器。

GET _analyze
{
  "text": "I like go to school.",
  "tokenizer": "aliws_tokenizer"
}

预期结果如下。

{
  "tokens" : [
    {
      "token" : "I",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : " ",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "like",
      "start_offset" : 2,
      "end_offset" : 6,
      "type" : "word",
      "position" : 2
    },
    {
      "token" : " ",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "word",
      "position" : 3
    },
    {
      "token" : "go",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "word",
      "position" : 4
    },
    {
      "token" : " ",
      "start_offset" : 9,
      "end_offset" : 10,
      "type" : "word",
      "position" : 5
    },
    {
      "token" : "to",
      "start_offset" : 10,
      "end_offset" : 12,
      "type" : "word",
      "position" : 6
    },
    {
      "token" : " ",
      "start_offset" : 12,
      "end_offset" : 13,
      "type" : "word",
      "position" : 7
    },
    {
      "token" : "school",
      "start_offset" : 13,
      "end_offset" : 19,
      "type" : "word",
      "position" : 8
    },
    {
      "token" : ".",
      "start_offset" : 19,
      "end_offset" : 20,
      "type" : "word",
      "position" : 9
    }
  ]
}

自定义分词器构造说明

  • analysis-aliws插件分词完成后,还会经过filter处理,包括:去词根filter、LowerCaseFilter、PorterStemFilter和StopFilter。如果您的自定义分词器上也需要使用这些filter,可在自定义分词器中加入analysis-aliws插件的分词器aliws_tokenizer,并根据业务需要增加filter配置,示例如下。其中stopwords内可以添加您业务所需配置的停用词。

    PUT my-index-000001
    {
      "settings": {
        "analysis": {
         "filter": {
          "my_stop": {
           "type": "stop",
           "stopwords": [
            " ",
            ",",
            ".",
            " ",
            "a",
            "的"
           ]
          }
         },
         "analyzer": {
          "my_custom_analyzer": {
           "type": "custom",
           "tokenizer": "aliws_tokenizer",
           "filter": [
            "lowercase",
            "porter_stem",
            "my_stop"
           ]
          }
         }
        }
        }
    }
    说明

    如果您不需要filter,可自行删除filter配置。

  • aliws_tokenizer支持通过synonym构造自定义分词器,配置方式与IK分词器一致,详细信息请参见使用同义词

常见问题

  • 使用aliws分词器进行单词分词后,单词结尾字母缺失。例如:对iPhoneChinese进行分词得到的结果是Iphonchines,结尾的e没有了。

    • 原因:aliws在分词后有去词根的filter操作,导致结尾的e被去掉了。

    • 解决方案:执行下面命令自定义analysis为:my_custom_analyzer,去掉filter部分。

      PUT my-index1
      {
          "settings": {
              "number_of_shards": 1,
              "analysis": {
                  "analyzer": {
                      "my_custom_analyzer": {
                          "type": "custom",
                          "tokenizer": "aliws_tokenizer"
                      }
                  }
              }
          }
      }
    • 验证:执行如下命令,测试分词效果是否符合预期。

      GET my-index1/_analyze
      {
          "analyzer": "my_custom_analyzer",
          "text": ["iphone"]
      }

相关文档