Amazon Elasticsearch Service 的自定义程序包 - Amazon Elasticsearch Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon Elasticsearch Service 的自定义程序包

Amazon Elasticsearch Service 可让您上传自定义字典文件(例如,停用词和同义词)以用于集群。这些类型的文件的通用术语是程序包。字典文件通过告诉 Elasticsearch 忽略某些高频字词或将诸如“软冻蛋奶”、”冰淇淋”和“冰激凌”等词语视为等效,从而改善搜索结果。它们也可以改进词干提取,如在日语 (kuromoji) 分析插件中。

将程序包上传到 Amazon S3

在您将程序包与域关联之前,您必须将其上传到 Amazon S3 存储桶。有关说明,请参阅 Amazon Simple Storage Service 入门指南 中的上传 S3 对象

如果程序包包含敏感信息,请在上传时指定使用 S3 托管密钥进行服务器端加密。Amazon ES 无法访问 S3 上使用 AWS KMS 主密钥进行保护的文件。

上传文件后,记下其 S3 路径。路径格式为 s3://bucket-name/file-path/file-name

您可以使用以下同义词文件进行测试。将其保存为 synonyms.txt

danish, croissant, pastry ice cream, gelato, frozen custard sneaker, tennis shoe, running shoe basketball shoe, hightop

某些字典(如 Hunspell 字典)使用多个文件,并且在文件系统上需要自己的目录。目前,Amazon ES 仅支持单文件字典。

导入和关联程序包

控制台是将程序包导入到 Amazon ES 中并将程序包与域关联的最简单方法。从 Amazon S3 导入程序包时,Amazon ES 存储自己的程序包副本,并使用 AES-256 以及 Amazon ES 托管密钥自动加密该副本。

导入包并将其与域关联(控制台)

  1. 转至 https://aws.amazon.com,然后选择 Sign In to the Console (登录控制台)

  2. Analytics (分析) 下,选择 Elasticsearch Service

  3. 在导航窗格中,选择 Packages (程序包)

  4. 选择 Import

  5. 为程序包提供描述性名称。

  6. 提供文件的 S3 路径,然后选择 Import (导入)

  7. 返回到 Packages (程序包) 屏幕。

  8. 当程序包状态为 Available (可用) 时,选择它。然后选择 Associate to a domain (关联到域)

  9. 选择一个域,然后选择 Associate (关联)

  10. 在导航窗格中,选择您的域,然后选择 Packages (程序包) 选项卡。

  11. 当程序包状态为 Available (可用) 时,记下它的 ID。将 analyzers/id 用作针对 Elasticsearch 的请求中的文件路径。

或者,使用 AWS CLI、开发工具包或配置 API 导入和关联程序包。有关更多信息,请参阅 AWS CLI Command ReferenceAmazon Elasticsearch Service 配置 API 参考

将自定义程序包与 Elasticsearch 结合使用

将文件与域关联后,您可以在创建标记器和标记筛选条件时,在诸如 synonyms_pathstopwords_pathuser_dictionary 等参数中使用该文件。确切的参数因对象而异。多个对象支持 synonyms_pathstopwords_path,但 user_dictionary 专用于 kuromoji 插件。以下示例请求将同义词文件添加到新索引中:

PUT my-index { "settings": { "index": { "analysis": { "analyzer": { "synonym_analyzer": { "type": "custom", "tokenizer": "standard", "filter": ["synonym_filter"] } }, "filter": { "synonym_filter": { "type": "synonym", "synonyms_path": "analyzers/F111111111" } } } } }, "mappings": { "properties": { "description": { "type": "text", "analyzer": "synonym_analyzer" } } } }

此请求为使用标准标记器和同义词标记筛选条件的索引创建自定义分析器。

  • 标记器根据一组规则将字符流分解为标记(通常是字词)。最简单的例子是空白标记器,它在每次遇到空白字符时都会将前面的字符分解为标记。一个更复杂的例子是标准标记器,它使用一组基于语法的规则来跨多种语言工作。

  • 标记筛选条件可添加、修改或删除标记。例如,同义词标记筛选条件在同义词列表中找到字词时添加标记。停止标记筛选条件在停用词列表中找到字词时删除标记。

此请求还将文本字段 (description) 添加到映射中,并告诉 Elasticsearch 对该字段使用新的分析器。

为了进行测试,请将一些文档添加到索引中:

POST _bulk { "index": { "_index": "my-index", "_id": "1" } } { "description": "ice cream" } { "index": { "_index": "my-index", "_id": "2" } } { "description": "croissant" } { "index": { "_index": "my-index", "_id": "3" } } { "description": "tennis shoe" } { "index": { "_index": "my-index", "_id": "4" } } { "description": "hightop" }

然后使用同义词搜索它们:

GET my-index/_search { "query": { "match": { "description": "gelato" } } }

在这种情况下,Elasticsearch 返回以下响应:

{ "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 0.99463606, "hits": [{ "_index": "my-index", "_type": "_doc", "_id": "1", "_score": 0.99463606, "_source": { "description": "ice cream" } }] } }
提示

字典文件使用与其大小成正比的 Java 堆空间。例如,2 GiB 字典文件可能会占用节点上 2 GiB 的堆空间。如果使用大型文件,请确保节点具有足够的堆空间来容纳它们。监控 JVMMemoryPressure 指标,并根据需要扩展集群。

更新自定义程序包

将新版本的程序包上传到 Amazon S3 会在 Amazon Elasticsearch Service 上自动更新程序包。Amazon ES 存储自己的文件副本,因此,如果您将新版本上传到 S3,则必须再次将该文件导入到 Amazon ES 中并将其与您的域关联

将更新后的文件与您的域关联后,您可以使用将自定义程序包与 Elasticsearch 结合使用中的请求将其与新索引结合使用。

但是,如果要将更新后的文件与现有索引结合使用,必须重新对它们编制索引。首先,创建使用更新的同义词文件的索引:

PUT my-new-index { "settings": { "index": { "analysis": { "analyzer": { "synonym_analyzer": { "type": "custom", "tokenizer": "standard", "filter": ["synonym_filter"] } }, "filter": { "synonym_filter": { "type": "synonym", "synonyms_path": "analyzers/F222222222" } } } } }, "mappings": { "properties": { "description": { "type": "text", "analyzer": "synonym_analyzer" } } } }

然后,将旧索引重新编制为该新索引:

POST _reindex { "source": { "index": "my-index" }, "dest": { "index": "my-new-index" } }

如果您经常更新同义词文件,请使用索引别名来维护最新索引的一致路径:

POST _aliases { "actions": [ { "remove": { "index": "my-index", "alias": "latest-index" } }, { "add": { "index": "my-new-index", "alias": "latest-index" } } ] }

如果您不需要旧索引,请将其删除。如果您不再需要旧版本的程序包,请取消关联并将其删除

取消程序包关联并删除程序包

将程序包与域取消关联意味着:在创建新索引时,您不能再使用该文件。任何已经使用该文件的索引都可以继续使用它。

控制台是将程序包与域取消关联并将其从 Amazon ES 中删除的最简单方法。从 Amazon ES 中删除程序包 会将程序包从它在 Amazon S3 上的原始位置删除。

将程序包与域取消关联并将其从 Amazon ES 中删除(控制台)

  1. 转至 https://aws.amazon.com,然后选择 Sign In to the Console (登录控制台)

  2. Analytics (分析) 下,选择 Elasticsearch Service

  3. 在导航窗格中,选择您的域,然后选择 Packages (程序包) 选项卡。

  4. 选择程序包、Actions (操作),然后选择则 Dissociate (取消关联)。确认您的选择。

  5. 等待程序包从列表中消失。您可能需要刷新浏览器。

  6. 如果要将程序包与其他域一起使用,请在此处停止。要继续删除程序包,请在导航窗格中选择 Packages (程序包)

  7. 选择程序包,然后选择 Delete (删除)

或者,使用 AWS CLI、开发工具包或配置 API 取消程序包关联并删除程序包。有关更多信息,请参阅 AWS CLI Command ReferenceAmazon Elasticsearch Service 配置 API 参考