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

185 阅读7分钟

作者:来自 Elastic Gustavo Llermaly

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

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

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

目录

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

AI 问题

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

使用同义词 API 创建同义词

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

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



1.  PUT _synonyms/my-synonyms-set
2.  {
3.    "synonyms_set": [
4.      {
5.        "synonyms": "AI, Artificial Intelligence"
6.      }
7.    ]
8.  }


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

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



1.  PUT /synonyms-index
2.  {
3.    "settings": {
4.      "analysis": {
5.        "filter": {
6.          "synonyms_filter": {
7.            "type": "synonym",
8.            "synonyms_set": "my-synonyms-set",
9.            "updateable": true
10.          }
11.        },
12.        "analyzer": {
13.          "my_search_analyzer": {
14.            "type": "custom",
15.            "tokenizer": "standard",
16.            "filter": ["lowercase", "synonyms_filter"]
17.          }
18.        }
19.      }
20.    },
21.    "mappings": {
22.      "properties": {
23.        "title": {
24.          "type": "text",
25.          "analyzer": "standard",
26.          "fields": {
27.            "synonyms": {
28.              "type": "text",
29.              "analyzer": "standard",
30.              "search_analyzer": "my_search_analyzer"
31.            }
32.          }
33.        }
34.      }
35.    }
36.  }


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

测试一下

让我们添加一些文档:



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


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

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



1.  GET synonyms-index/_search 
2.  {
3.    "query": {
4.      "match": {
5.        "title": "AI"
6.      }
7.    }
8.  }


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

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



1.  GET synonyms-index/_search 
2.  {
3.    "query": {
4.      "match": {
5.        "title.synonyms": "AI"
6.      }
7.    }
8.  }


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

短语同义词支持

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

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

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

关闭索引:

POST /synonyms-index/_close

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

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



1.  PUT /synonyms-index/_settings
2.  {
3.    "analysis": {
4.      "filter": {
5.        "synonyms_filter": {
6.          "type": "synonym_graph",
7.          "synonyms_set": "my-synonyms-set",
8.          "updateable": true
9.        }
10.      },
11.      "analyzer": {
12.        "my_search_analyzer": {
13.          "type": "custom",
14.          "tokenizer": "standard",
15.          "filter": [
16.            "lowercase",
17.            "synonyms_filter"
18.          ]
19.        }
20.      }
21.    }
22.  }


我们再次打开索引:

POST /synonyms-index/_open

现在让我们运行搜索:



1.  GET synonyms-index/_search 
2.  {
3.    "query": {
4.      "match": {
5.        "title.synonyms": "AI"
6.      }
7.    }
8.  }


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

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



1.  GET synonyms-index/_search 
2.  {
3.    "query": {
4.      "match": {
5.        "title.synonyms": "artificial intelligence"
6.      }
7.    }
8.  }


Adobe Illustrator?

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

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

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

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

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



1.  POST synonyms-index/_analyze
2.  {
3.    "analyzer": "my_search_analyzer",
4.    "text": "artificial intelligence"
5.  }


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

扩展同义词

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

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



1.  PUT _synonyms/my-synonyms-set
2.  {
3.    "synonyms_set": [
4.      {
5.        "synonyms": "AI => Artificial Intelligence"
6.      }
7.    ]
8.  }


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

让我们再分析一下:



1.  POST synonyms-index/_analyze
2.  {
3.    "analyzer": "my_search_analyzer",
4.    "text": "artificial intelligence"
5.  }


ai token 已消失。

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



1.  GET synonyms-index/_search 
2.  {
3.    "query": {
4.      "match": {
5.        "title.synonyms": "artificial intelligence"
6.      }
7.    }
8.  }


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



1.  GET synonyms-index/_search 
2.  {
3.    "query": {
4.      "match": {
5.        "title.synonyms": {
6.          "query": "artificial intelligence",
7.          "operator": "AND"
8.        }
9.      }
10.    }
11.  }


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

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



1.  DELETE synonyms-index
2.  DELETE _synonyms/my-synonyms-set


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

结论

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

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

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

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