【问题标题】:Is there a way to apply the synonym token filter in ElasticSearch to field names rather than the value?有没有办法将 ElasticSearch 中的同义词标记过滤器应用于字段名称而不是值?
【发布时间】:2015-01-20 15:22:59
【问题描述】:

考虑以下 JSON 文件:

{
  "titleSony": "Matrix",
  "cast": [
    {
      "firstName": "Keanu",
      "lastName": "Reeves"
    }
  ]
}

现在,我知道在 ElasticSearch 中,您可以将同义词标记过滤器应用于以下链接中给出的字段值:Elasticsearch Analysis: Synonym token filter。

因此,我可以使用Matrix => Matx 创建一个“synonym.txt”文件,然后如果我搜索titleSony:Matx,它也会返回带有Matrix 的文档。

现在,我想要为字段名称titleSony 创建一个同义词。例如 - titleSony => titleAll,这样当我搜索 titleAll 时,我也应该得到所有带有 titleSony 的文档。

有没有办法在 ElasticSearch 中实现这一点?

【问题讨论】:

    标签: elasticsearch mapping jsonschema synonym elasticsearch-plugin


    【解决方案1】:

    现在,我想要为字段名称“titleSony”创建一个同义词。例如 - titleSony => titleAll ,因此当我搜索“titleAll”时,我也应该得到所有带有“titleSony”的文档。

    是的,有点。 Elasticsearch 有一些与此非常相似的默认行为,我稍后会谈到。

    您要查找的功能称为“Copy to field”。它允许您指定应将一个字段中的术语复制到另一个字段中。这对于将您希望匹配的术语合并到一个字段中很有用,当您希望匹配多个字段中的任何一个时,有助于简化查询。

    在此示例中,您将在映射中指定应将 titleSony 字段中的术语复制到 titleAll 字段中。大概您还有其他字段(例如titleDisney)也可以复制到该字段中。因此,对 titleAll 的搜索将有效地匹配其术语被复制到其中的其他字段。

    您的映射的摘录可能如下所示:

    {
      "movies" : {
        "properties" : {
          "titleSony" :   { "type" : "string", "copy_to" : "titleAll" },
          "titleDisney" : { "type" : "string", "copy_to" : "titleAll" },
          "titleAll" :    { "type" : "string" },
          "cast" : { ... },
          ...
        }
    }
    

    我之前提到过 Elasticsearch 会做这样的事情。默认情况下,它会创建一个名为_all 的特殊字段,所有文档的术语都将复制到该字段中。此字段允许您构建非常简单的查询来匹配文档中任何字段中出现的术语。如您所见,这是 Elasticsearch 中相当普遍的约定。 (Elasticsearch mapping: _all field.)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 2021-08-26
      相关资源
      最近更新 更多