Elasticsearch:Mapper Annotated Text Plugin 及其使用
2022年4月12日 | by mebius
注意:此功能处于技术预览阶段,可能会在未来版本中更改或删除。 Elastic 将尽最大努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 约束。
mapper-annotated-text插件提供了索引文本的能力,该文本是自由文本和特殊标记的组合,通常用于识别感兴趣的项目,例如人员或组织(请参阅 NER 或命名实体识别工具)。
elasticsearch 标记允许将一个或多个附加标记不加更改地注入标tgcode记流中与它注释的基础文本相同的位置。
安装
可以使用插件管理器安装此插件:
sudo bin/elasticsearch-plugin install mapper-annotated-text
$ sudo bin/elasticsearch-plugin install mapper-annotated-text
Password:
-> 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/_searchtgcode
{
"query": {
"term": {
"my_field": "Beck"
}
}
}
上面的搜索返回:
{
"took" : 142,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successftgcodeul" : 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) 将导致文档因解析失败而被拒绝。 将来我们希望使用等号。