Elasticsearch:用同义词 API 像专家一样处理短语同义词
2024年11月29日 | by mebius
作者:来自 ElasticGustavo Llermaly
了解如何在实际场景中通过同义词 API 使用短语同义词。
同义词一直以来都是 Elasticsearch 的核心功能,你可以利用它们来获得出色的搜索结果。人们通常认为同义词只是一对彼此相等的单词,但仅此而已吗?
新的同义词 API(synonyms API) 允许你快速轻松地创建和更新同义词,而 synchroute_graph 过滤器可让你顺利处理多词同义词。在本文中,我们将探索配置同义词的不同方法,并使用它们来解决常见但棘手的问题。
目录
- AI 问题
- 使用同义词 API 创建同义词
- 测试
- 短语同义词支持
- 扩展同义词
AI 问题
情况是这样的:我们正处于 AI 热潮中,你希望与这项技术相关的文档成为人们获得的第一个搜索结果。想象一个包含 AI 文档和商业智能文档的系统。它既有 AI 文章,也有 Adobe 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"
}
}
}
正如预期的那样,我们在结果中得到了 Adobe Illustrator 课程。
如果我们现在尝试将我们的字段与同义词一起使用会怎么样?
GET synonyms-index/_search
{
"query": {
"match": {
"title.synonyms": "AI"
}
}
}
这样更好,但是,商业智能(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"
}
}
}
太棒了!Business Intelligence 文章已经不存在了。
如果我们明确搜索 artificial intelligence 会发生什么?
GET synonyms-index/_search
{
"query": {
"match": {
"title.synonyms": "artificial intelligence"
}
}
}
AdobeIllustrator?
那么现在发生了什么?这就是我在文章开头所说的,我们需要挑战同义词只是两个等价词的概念。我们还需要考虑扩展的方向性。
默认情况下,如果我们说 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"
}
如你所见,我们正在生成一个 ai token,它存在于 Adobe 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"
}
ai token 已消失。
现在,让我们检查搜索是否按预期工作:
GET synonyms-index/_search
{
"query": {
"match": {
"title.synonyms": "artificial intelligence"
}
}
}
Business Intelligence 又来了!但这次,原因不同。默认tgcode匹配查询运算符是 OR,两个文档都包含单词 intelligence。如果我们想运行更严格的搜索并确保所有关键字都存在,我们可以使用 match_phrase 或将 operator 参数更改为 AND。
GET synonyms-index/_search
{
"query": {
"match": {
"title.synonyms": {
"query": "artificial intelligence",
"operator": "AND"
}
}
}
}
现在,无论人们如何搜索,我们的 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 像专家一样处理短语同义词