使用AliNLP分词插件(analysis-aliws)
AliNLP分词插件(analysis-aliws)是阿里云Elasticsearch自带的一个系统默认插件。通过该插件,您可以在阿里云ES中集成对应的分析器和分词器,完成文档的分析和检索。您也可以使用analysis-aliws插件的词库配置功能,通过词典文件热更新自定义词库配置(替换默认词典)。
插件介绍
安装analysis-aliws插件后,阿里云ES默认会集成以下分析器和分词器。您可以使用这些分析器和分词器查询文档,也可以通过词库配置功能自定义更新分词词库。
分析器:aliws(不会截取虚词、虚词短语、符号)
分词器:aliws_tokenizer
如果您需要构造自定义分词器,请参见自定义分词器构造说明。
前提条件
已安装analysis-aliws插件(默认未安装)。安装方法,请参见安装或卸载系统默认插件。
使用限制
5.x版本和开启Indexing Service索引服务的7.10版本暂不支持安装analysis-aliws插件。
ES实例的内存要求4 GB及以上(生产环境中要求内存最低为8 GB)。如果内存不满足要求,请先升级集群,请参见升配集群。
基于云原生管控的实例(7.16及以上版本和部分地域的7.10版本实例)不支持analysis-aliws插件的词库配置功能,请以控制台为准。
查询文档
- 登录目标阿里云Elasticsearch实例的Kibana控制台,根据页面提示进入Kibana主页。登录Kibana控制台的具体操作,请参见登录Kibana控制台。说明 本文以阿里云Elasticsearch 6.7.0版本为例,其他版本操作可能略有差别,请以实际界面为准。
- 在左侧导航栏,单击Dev Tools。
在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" }
执行如下命令,添加文档。
重要如下命令仅适用于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 }
执行如下命令,查询文档。
重要如下命令仅适用于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插件支持词库配置,即上传自定义的词典文件aliws_ext_dict.txt。上传后节点能自动加载词典文件,实现词典的热更新操作(不会触发集群重启)。
analysis-aliws插件安装后,系统不会自带默认词典文件aliws_ext_dict.txt,需要您手动上传。
在配置词库前,您需要先准备自定义的词典文件,并重命名为aliws_ext_dict.txt。
词典文件的内容中不能包含隐藏符号,例如以空格结尾的分词。
- 登录阿里云Elasticsearch控制台。
- 在左侧导航栏,单击Elasticsearch实例。
- 进入目标实例。
- 在顶部菜单栏处,选择资源组和地域。
- 在Elasticsearch实例中单击目标实例ID。
在左侧导航栏,选择 。
在系统默认插件列表中,单击analysis-aliws插件右侧操作列下的词库配置。
在词库配置页面下方,单击配置。
选择词典文件的上传方式,并按照以下说明上传词典文件。
重要analysis-aliws插件仅支持上传一个词典文件,且文件名必须为aliws_ext_dict.txt。如果您已经上传了aliws_ext_dict.txt文件并且需要更新词典文件,可单击aliws_ext_dict.txt右侧的x,删除已上传的aliws_ext_dict.txt词典文件并重新上传同名词典文件。
词典文件要求如下:
文件名:必须是aliws_ext_dict.txt。
文件格式:必须是UTF-8格式。
内容:每行一个词,前后不能有空白字符;需要使用UNIX或Linux的换行符,即每行结尾是
\n
。如果是在Windows系统中生成的文件,需要在Linux机器上使用dos2unix工具将词典文件处理后再上传。
您可以通过Text文件和添加OSS文件两种方式上传词典文件:
Text文件:单击上传txt文件,选择一个本地文件进行上传。
添加OSS文件:输入Bucket名称和文件名称,单击添加。
请确保Bucket与阿里云Elasticsearch实例在同一区域下。且源端(OSS)的文件内容发生变化后,需要重新上传词典文件才能生效,不支持自动同步更新。
单击保存。
保存后,不会触发集群重启,但会触发集群变更使词典文件生效,此过程需要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分词器进行单词分词后,单词结尾字母缺失。例如:对
iPhone
、Chinese
进行分词得到的结果是Iphon
、chines
,结尾的e
没有了。原因:aliws在分词后有去词根的filter操作,导致结尾的
e
被去掉了。解决方案:执行下面命令自定义analysis为:my_custom_analyzer,去掉fiter部分。
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"] }