elasticsearch - 同义词、产品名称和带状疱疹
问题描述
我正在使用 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 新手,我怀疑我错过了一些可以解决此问题的简单方法。
解决方案
带状疱疹和同义词一起出现在同一个字段上可能会导致问题。出于这个原因,我总是通过在同一个字段中创建多个字段来使用它们。一个字段可以使用带有同义词过滤器的分析器,而其他字段可以使用 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 查询。
推荐阅读
- python - 如何在数据透视表中单独列出列表的组件?
- pandas - 使用 pandas 和 yahoo Finance 将数据保存到 csv 文件
- git - 如果 PR 已经合并到不同的分支,有没有办法再次创建 PR 到其他分支?
- java - MySQL选择从今年到去年特定月份的所有行
- uml - 为什么它在条件下使用“ ErrCounter >= limt ”?
- image - 尽管从资产中提供了彩色图像,但 SVG 图片在颤动中返回黑色图像
- c++ - 在模板函数内的 lambda 内不会丢弃“if constexpr 分支”
- flask - Airflow Webserver 访问日志的位置
- mongodb - 如何从 MongoDB 中的查询创建集合?
- python - 在 Python re.sub 函数中,如何使用 \n 语法引用组 0?