AliNLP分词插件是阿里云Elasticsearch(简称ES)自带的一个系统默认插件。通过该插件,您可以在阿里云ES中集成对应的分析器和分词器,完成文档的分析和检索。您也可以使用AliNLP分词插件的词库配置功能,通过词典文件的热更新自定义词库配置。目前5.x版本的阿里云ES实例不支持AliNLP分词插件。

前提条件

已安装AliNLP分词插件(英文名为analysis-aliws,默认未安装)。

如果还未安装,请先安装AliNLP分词插件。安装前请确保实例的内存大小为4G及以上,具体安装步骤请参见安装或卸载系统默认插件

注意 在生产环境中使用AliNLP分词插件时,要求实例的内存大小最低为8G。如果不满足,请先将内存大小升级至8G及以上,详情请参见升配集群

背景信息

AliNLP分词插件安装成功后,阿里云ES默认会集成如下的分析器和分词器:
  • 分析器:aliws(不会截取虚词、虚词短语、符号)。
  • 分词器:aliws_tokenizer

您可以使用上述的分析器和分词器完成文档的查询。您也可以通过词库配置功能,自定义更新分词词库,详情请参见下文的配置词库

操作步骤

  1. 登录对应阿里云ES实例的Kibana控制台。
    登录控制台的具体步骤请参见登录Kibana控制台
  2. 单击左侧导航栏的Dev Tools(开发工具)。
  3. Console中执行以下命令创建索引。
    PUT /index
    {
        "mappings": {
            "fulltext": {
                "properties": {
                    "content": {
                        "type": "text",
                        "analyzer": "aliws"
                    }
                }
            }
        }
    }

    以上代码创建了一个名称为index的索引,类型为fulltext。包含了一个content属性,类型为text,并添加了aliws分析器。

    执行成功后,返回如下结果。
    {
      "acknowledged": true,
      "shards_acknowledged": true,
      "index": "index"
    }
  4. 执行如下命令,添加文档。
    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. 执行如下命令,查询文档。
    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."
            }
          }
        ]
      }
    }
说明 如果您在使用AliNLP分词插件时,得到的结果不符合预期,可通过下文的测试分析器测试分词器进行排查调试。

配置词库

AliNLP分词插件支持自定义词库配置,上传词典文件后阿里云ES节点能自动加载词典文件,实现词典的热更新操作(不会触发集群重启)。

  1. 登录阿里云Elasticsearch控制台
  2. 在顶部菜单栏处,选择地域。
  3. 单击目标实例ID/名称链接。
  4. 在左侧导航栏,单击插件配置
  5. 系统默认插件列表中,单击analysis-aliws插件右侧操作栏下的词库配置
  6. 插件配置页面右下角,单击配置
  7. 选择词典文件的上传方式,并按照以下说明上传词典文件。
    更新ALIWS分词词库
    词典文件要求如下:
    • 文件名:必须是aliws_ext_dict.txt。
    • 文件格式:必须是UTF-8格式。
    • 内容:每行一个词,前后不能有空白字符;需要使用UNIX或Linux的换行符,即每行结尾是\n。如果是在Windows系统中生成的文件,需要在Linux机器上使用dos2unix工具将词典文件处理后再上传。
    您可以通过上传Text文件添加OSS文件两种方式上传词典文件:
    • 上传Text文件:单击上传txt文件,选择一个本地文件进行上传。
    • 添加OSS文件:输入Bucket名称和文件名称,单击添加

      请确保Bucket与当前阿里云ES实例在同一区域下。且源端(OSS)的文件内容发生变化后,需要重新手动配置上传才能生效,不支持自动同步更新。

  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
    }
  ]
}