Elasticsearch:用同义词 API 像专家一样处理短语同义词

2024年11月29日   |   by mebius

作者:来自 ElasticGustavo Llermaly

%title插图%num

了解如何在实际场景中通过同义词 API 使用短语同义词。

同义词一直以来都是 Elasticsearch 的核心功能,你可以利用它们来获得出色的搜索结果。人们通常认为同义词只是一对彼此相等的单词,但仅此而已吗?

新的同义词 API(synonyms API) 允许你快速轻松地创建和更新同义词,而 synchroute_graph 过滤器可让你顺利处理多词同义词。在本文中,我们将探索配置同义词的不同方法,并使用它们来解决常见但棘手的问题。

目录

  • AI 问题
  • 使用同义词 API 创建同义词
  • 测试
  • 短语同义词支持
  • 扩展同义词

AI 问题

情况是这样的:我们正处于 AI 热潮中,你希望与这项技术相关的文档成为人们获得的第一个搜索结果。想象一个包含 AI 文档和商业智能文档的系统。它既有 AI 文章,也有 Adob​​e Illustrator (AI) 文章。让我们看看同义词如何帮助我们创建满足当今要求的用户体验。

使用同义词 API 创建同义词

新的同义词 API 允许你创建同义词,而无需上传文件或在节点中运行其他命令来更新它们,这通常会导致文件在节点之间不一致或与 Elastic Serverless 一起使用时出现问题。

让我们从创建同义词开始:

PUT _synonyms/my-synonyms-set
{
  "synonyms_set": [
    {
      "synonyms": "AI, Artificial Intelligence"
    }
  ]
}

在分析器使用同义词集之前创建同义词集非常重要

现在,让我们配置索引以使用同义词。为了获得更灵活的查询,我们将创建一个包含同义词的字段,另一个不包含同义词的字段。因此 title 不会有同义词,而 title.synonyms 会有同义词。脚本如下:

PUT /synonyms-index
{
  "settings": {
    "analysis": {
      "filter": {
        "synonyms_filter": {
          "type": "synonym",
          "synonyms_set": "my-synonyms-set",
          "updateable": true
        }
      },
      "analyzer": {
        "my_search_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase", "synonyms_filter"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "standard",
        "fields": {
          "synonyms": {
            "type": "text",
            "analyzer": "standard",
            "search_analyzer": "my_search_analyzer"
          }
        }
      }
    }
  }
}

请注意,我们将在字段(field)搜索分析器中使用同义词,而不是将其用作索引(index)级别的分析器,因此我们不会将它们存储在索引中,而是在每次查询时生成它们 – 牺牲一些性能来换取更大的灵活性。在分析器中使用它们而不是对它们进行索引,允许你使用新 API 更新同义词并使用更少的磁盘空间。

测试一下

让我们添加一些文档:

POST _bulk
{ "index" : { "_index" : "synonyms-index", "_id" : "1" } }
{ "title" : "Adobe Illustrator (AI) tutorial" }
{ "index" : { "_index" : "synonyms-index", "_id" : "2" } }
{ "title" : "Artificial Intelligence from zero to hero: The best techniques to master machine learning algorithms." }
{ "index" : { "_index" : "synonyms-index", "_id" : "3" } }
{ "title" : "Business Intelligence: Course for young professionals" }

我们的明星文档是 #2。它讨论了 AI 以及我们想在用户中推广的内容。

现在,让我们开始不使用同义词进行搜索:

GET synonyms-index/_search 
{
  "query": {
    "match": {
      "title": "AI"
    }
  }
}

%title插图%num

正如预期的那样,我们在结果中得到了 Adob​​e Illustrator 课程。

如果我们现在尝试将我们的字段与同义词一起使用会怎么样?

GET synonyms-index/_search 
{
  "query": {
    "match": {
      "title.synonyms": "AI"
    }
  }
}

%title插图%num

这样更好,但是,商业智能(Business Intelligence)文档在这里做什么?

短语同义词支持

在上一个示例中,我们使用了不支持多词或短语同义词的token synonym filter。这就是将 Business Intelligence 与 AI 匹配的原因。Artificial 和 Intelligence 不被视为短语,而是单个标记。让我们来解决这个问题!

这是一个简单的修复。我们需要使用 synonym_graph。这是一个允许你处理多词同义词的变体。虽然它只能用作搜索分析器,但与在索引时使用同义词相比,在搜索阶段使用同义词可能更有优势。

我们可以通过运行以下序列来更新搜索分析器而无需重新索引数据:

关闭索引:

POST /synonyms-index/_close

注意:如果涉及到修改索引中的 settings 部分,我们需要上面的 _close 操作。

编辑 settings。请注意,现在过滤器的类型是 synonym_graph,而不是 synonym:

PUT /synonyms-index/_settings
{
  "analysis": {
    "filter": {
      "synonyms_filter": {
        "type": "synonym_graph",
        "synonyms_set": "my-synonyms-set",
        "updateable": true
      }
    },
    "analyzer": {
      "my_search_analyzer": {
        "type": "custom",
        "tokenizer": "standard",
        "filter": [
          "lowercase",
          "synonyms_filter"
        ]
      }
    }
  }
}

我们再次打开索引:

POST /synonyms-index/_open

现在让我们运行搜索:

GET synonyms-index/_search 
{
  "query": {
    "match": {
      "title.synonyms": "AI"
    }
  }
}

%title插图%num

太棒了!Business Intelligence 文章已经不存在了。

如果我们明确搜索 artificial intelligence 会发生什么?

GET synonyms-index/_search 
{
  "query": {
    "match": {
      "title.synonyms": "artificial intelligence"
    }
  }
}

%title插图%num

AdobeIllustrator?

%title插图%num

那么现在发生了什么?这就是我在文章开头所说的,我们需要挑战同义词只是两个等价词的概念。我们还需要考虑扩展的方向性。

默认情况下,如果我们说 AI,Artificial Intelligence,它意味着两件事:

  • AI 等同于 Artificial Inttgcodeelligence
  • Artificial Intelligence 等同于 AI

在这种情况下,第 2 条并不正确。Adobe Illustrator 绝对不同于人工智能。

为了证实这一点,我们可以使用 _analyze API 来查看我们的搜索词是如何转换的:

POST synonyms-index/_analyze
{
  "analyzer": "my_search_analyzer",
  "text": "artificial intelligence"
}

%title插图%num

如你所见,我们正在生成一个 ai token,它存在于 Adob​​e Illustrator 文档中,从而产生了不必要的匹配。

扩展同义词

那么,我们最终该如何修复它呢?我们需要使用单向标记,其中 AI 与 Artificial Intelligence 相同,但 Artificial Intelligence 与 AI **不**相同。

感谢同义词 API,这非常简单。我们可以对现有同义词集进行 PUT 调用来更新它:

PUT _synonyms/my-synonyms-set
{
  "synonyms_set": [
    {
      "synonyms": "AI => Artificial Intelligence"
    }
  ]
}

此更改将用 Artificial Inttgcodeelligence 取代任何提及 AI 的内容。这样,即使提到 AI,Adobe Illustrator 也不会出现。如果我们确实希望它出现,我们可以创建这个同义词:“AI => AI, Artificial Intelligence”。

让我们再分析一下:

POST synonyms-index/_analyze
{
  "analyzer": "my_search_analyzer",
  "text": "artificial intelligence"
}

%title插图%num

ai token 已消失。

现在,让我们检查搜索是否按预期工作:

GET synonyms-index/_search 
{
  "query": {
    "match": {
      "title.synonyms": "artificial intelligence"
    }
  }
}

%title插图%num%title插图%num

Business Intelligence 又来了!但这次,原因不同。默认tgcode匹配查询运算符是 OR,两个文档都包含单词 intelligence。如果我们想运行更严格的搜索并确保所有关键字都存在,我们可以使用 match_phrase 或将 operator 参数更改为 AND。

GET synonyms-index/_search 
{
  "query": {
    "match": {
      "title.synonyms": {
        "query": "artificial intelligence",
        "operator": "AND"
      }
    }
  }
}

%title插图%num

现在,无论人们如何搜索,我们的 AI 文档都将成为搜索结果中的佼佼者。

最后,让我们清理一下我们创建的索引和同义词集:

DELETE synonyms-index
DELETE _synonyms/my-synonyms-set

你可以在本文中阅读有关同义词 API 的更多信息。

结论

同义词是定制搜索体验的强大工具,因此了解可用的配置以获得所需的结果至关重要。同义词 API 允许你快速轻松地创建和更新同义词,而 synchroute_graph 过滤器可让你顺利处理多词同义词。

Elasticsearch 包含许多新功能,可帮助您为您的用例构建最佳搜索解决方案。深入了解我们的示例笔记本以了解更多信息,开始免费云试用,或立即在你的本地机器上试用 Elastic。

想要获得 Elastic 认证?了解下一期 Elasticsearch 工程师培训何时举行!

原文:Phrase synonyms like a boss with the synonyms API – Search Labs

文章来源于互联网:Elasticsearch:用同义词 API 像专家一样处理短语同义词

Tags: , , , ,