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) 将导致文档因解析失败而被拒绝。 将来我们希望使用等号。

文章来源于互联网:Elasticsearch:Mapper Annotated Text Plugin 及其使用

Tags: