注意:此功能处于技术预览阶段,可能会在未来版本中更改或删除。 Elastic 将尽最大努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 约束。
mapper-annotated-text 插件提供了索引文本的能力,该文本是自由文本和特殊标记的组合,通常用于识别感兴趣的项目,例如人员或组织(请参阅 NER 或命名实体识别工具)。
elasticsearch 标记允许将一个或多个附加标记不加更改地注入标记流中与它注释的基础文本相同的位置。
安装可以使用插件管理器安装此插件:
sudo bin/elasticsearch-plugin install mapper-annotated-text
$ sudo bin/elasticsearch-plugin install mapper-annotated-textPassword:-> Installing mapper-annotated-text-> Downloading mapper-annotated-text from elastic[=================================================] 100% -> Installed mapper-annotated-text-> Please restart Elasticsearch to activate any plugins installed
该插件必须安装在集群中的每个节点上,并且安装后必须重新启动每个节点。
你可以从 https://artifacts.elastic.co/downloads/elasticsearch-plugins/mapper-annotated-text/mapper-annotated-text-8.0.0.zip 下载此插件以进行离线安装。 要验证 .zip 文件,请使用 SHA 哈希或 ASC 密钥。
删除可以使用以下命令删除该插件:
sudo bin/elasticsearch-plugin remove mapper-annotated-text
在删除插件之前必须停止节点。
使用 annotated-text 字段annotated-text 根据更常见的文本字段对文本内容进行标记(参见下面的“限制”),但也将任何标记的注释标记直接注入搜索索引:
PUT my-index-000001{ "mappings": { "properties": { "my_field": { "type": "annotated_text" } } }}
这种映射将允许标记的文本(例如维基百科文章)被索引为文本和结构化标记。 注释使用类似 markdown 的语法,使用由 & 符号分隔的一个或多个值的 URL 编码。
我们可以使用 “_analyze” api 来测试示例注释如何作为标记存储在搜索索引中:
GET my-index-000001/_analyze{ "field": "my_field", "text":"Investors in [Apple](Apple+Inc.) rejoiced."}
上面的命令的响应为:
{ "tokens" : [ { "token" : "investors", "start_offset" : 0, "end_offset" : 9, "type" : "", "position" : 0 }, { "token" : "in", "start_offset" : 10, "end_offset" : 12, "type" : "", "position" : 1 }, { "token" : "Apple Inc.", "start_offset" : 13, "end_offset" : 18, "type" : "annotation", "position" : 2 }, { "token" : "apple", "start_offset" : 13, "end_offset" : 18, "type" : "", "position" : 2 }, { "token" : "rejoiced", "start_offset" : 19, "end_offset" : 27, "type" : "", "position" : 3 } ]}
请注意:整个注释标记 Apple Inc、被放置,作为标记流中的单个标记保持不变,并且与它注释的文本标记 (apple) 位于相同的位置(位置 2)。
我们现在可以使用没有标记提供的搜索值的常规 term 查询来执行注释搜索。 注释是一种更精确的匹配方式,如本例所示,其中对 Beck 的搜索将不匹配 Jeff Beck :
PUT my-index-000001/_doc/1{ "my_field": "[Beck](Beck) announced a new tour"}PUT my-index-000001/_doc/2{ "my_field": "[Jeff Beck](Jeff+Beck&Guitarist) plays a strat"}
在上面的 id 为 1 的文档里,将纯文本标记为单个单词,例如 beck,这里我们将单个 token 值 Beck 注入到 token 流中与 beck 相同的位置。在 id 为 2 的文档里,注意标注可以在同一位置注入多个标记 — 这里我们注入非常具体的值 Jeff Beck 和更广泛的术语 Guitarist。 这可以实现更广泛的位置查询,例如 发现提到一个靠近 Strat 的 Guitarist .
我们使用如下的搜索:
GET my-index-000001/_search{ "query": { "term": { "my_field": "Beck" } }}
上面的搜索返回:
{ "took" : 142, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.7654058, "hits" : [ { "_index" : "my-index-000001", "_id" : "1", "_score" : 0.7654058, "_source" : { "my_field" : "[Beck](Beck) announced a new tour" } } ] }}
使用这些仔细定义的注释标记进行搜索的一个好处是,对 Beck 的查询将不会匹配包含标记 jeff、beck 和 Jeff Beck 的文档。
警告:在标注值中使用 = 符号,例如 [Prince](person=Prince) 将导致文档因解析失败而被拒绝。 将来我们希望使用等号。