首页 > 解决方案 > 同义词、产品名称和带状疱疹

问题描述

我正在使用 AWS Elasticsearch Service 为移动应用程序构建产品搜索功能。我遇到了一个我想通过调整 ES 而不是预处理查询来解决的问题。这是一个例子:

Product User Wants: mini farfalle pasta

User's Query: mini bow-tie pasta

What Works: mini AND (bow-tie OR bow tie OR bowtie OR farfalle) AND pasta

我曾尝试使用带状疱疹构建索引。这样做会将以下内容放入索引中:

mini, mini farfalle, mini farfalle pasta, farfalle, farfalle pasta, pasta

我的下一个想法是创建一个这样的同义词图:

bow tie, bowtie, farfalle

然而,当我运行分析时,它看起来好像 ES 只是在用户查询中使用“bow-tie”并将其替换为“bow-tie bow tie bowtie farfalle”,基本上将查询变成:

mini bow-tie bow tie bowtie farfalle pasta

当我将新查询转换为构建为带状疱疹的搜索词时(以匹配我的索引),我得到以下信息:

mini, mini bowtie, mini bowtie farfalle, bowtie, bowtie farfalle, bowtie farfalle bow, farfalle, farfalle bow, farfalle bow tie, bow, bow tie, bow tie pasta, tie, tie pasta, pasta

其中没有一个会返回我正在寻找的产品。

我真正需要 ES 做的是 SUBSTITUTE 构建单曲的同义词,例如:

mini, mini bow-tie, mini bow-tie pasta, bow-tie, bow-tie pasta, pasta
mini, mini bow, mini bow tie, bow, bow tie, bow tie pasta, tie, tie pasta, pasta
mini, mini bowtie, mini bowtie pasta, bowtie, bowtie pasta, pasta
mini, mini farfalle, mini farfalle pasta, farfalle, farfalle pasta, pasta

由于我是 ES 新手,我怀疑我错过了一些可以解决此问题的简单方法。

标签: elasticsearch

解决方案


带状疱疹和同义词一起出现在同一个字段上可能会导致问题。出于这个原因,我总是通过在同一个字段中创建多个字段来使用它们。一个字段可以使用带有同义词过滤器的分析器,而其他字段可以使用 shingle 过滤器。

在此处阅读多字段:https ://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

在您的情况下,如果您创建这样的多字段,即使用户从同义词多字段中键入 bow-tie,您也可以找到包含 farfalle 的文档。这与 shingles 多字段上的查询不匹配。

但从好的方面来说,如果用户的查询本身包含 farfalle,它会对带有 farfalle 的文档的评分高于包含 bow-tie 的文档,因为它会匹配来自同义词和 shingle 过滤器的两个查询,并且会从两个查询中添加分数。

我建议在您的情况下使用多字段和不同的分析器(一个包含 shingle 过滤器和其他同义词过滤器),然后使用 multi_match 查询。


推荐阅读