【问题标题】:Favor exact matches over ngram matches in ElasticSearch when mapping映射时,在 ElasticSearch 中优先选择精确匹配而不是 ngram 匹配
【发布时间】:2014-07-04 09:25:51
【问题描述】:

我对使用 ngram 的单词进行了部分匹配。如何修改映射以始终支持精确匹配而不是 ngram 标记?我不想修改查询。一个搜索框将搜索多种类型,每种类型都有自己的字段。

例如,假设我正在搜索职位,一个人的头衔是“现场工程师”,另一个人的头衔是“引擎技术员”。如果用户搜索“引擎”,我希望 ES 返回更相关的后者。

我几乎一字不差地使用这个映射:https://stackoverflow.com/a/19874785/978622 -例外:我使用的是一个最小值为 3、最大值为 11 的 ngram,而不是边缘 ngram

是否可以将提升/功能得分应用于分析仪?如果是这样,我会将“full_name”和“partial_name”分析器都应用到我的索引中并提升第一个。

编辑:我正在使用 ElasticSearch 1.1.1 和 Nest 1.0.0 beta

【问题讨论】:

  • 每个查询是否限制为 1 个结果?在不知道 ES 的情况下,我建议你离开它,返回 bot 并让用户选择。
  • 不,它返回的列表与我指定的一样大。但是从更大的角度考虑。我的索引有 20000 个项目。我给出的例子将在更大范围内发生。我不能让用户自己选择。
  • 您可以为用户提供多种选择,例如10(仍然不用担心订购,因为用户无论如何都可以选择)。如果未列出所需结果,则用户范围缩小。这就是它的工作原理......
  • @MarcellFülöp 这没有抓住问题的重点。我不想忽略这个问题,而是想解决它。把它留给用户不是解决办法。
  • 这就是为什么我没有给出答案,只是试图暗示您可能不必要地过于复杂。我理解这个问题和你想要什么,但我不认为这是一个问题,或者除非有一个你还没有想出的非常好的理由,否则值得费心为这几个结果排序.

标签: elasticsearch nest


【解决方案1】:

我认为无论如何都不会像您建议的那样对分析仪应用增强功能。

您可以尝试的一件事是在映射中使用multi field 类型。然后,您可以将 partial_name 分析器应用于该字段的一个版本,并将您的 full_name 分析器应用于另一个版本。

使用此映射,您可以以不同方式查询两个字段,但可以组合起来(可能在 bool 查询中),并对在 full_name 分析字段上执行的查询应用增强。

【讨论】:

  • 我相信这就是你所说的。我确实使用了多场。在事物的索引方面,每个字段都有 2 个字段。一个用于完全匹配分析器,一个带有“ngram”后缀的 ngram 分析器。在查询方面,我使用了一个使用“OnFieldsWithBoost”的简单查询字符串我搜索的任何完整字段的提升都比搜索的任何 ngram 字段高 .1。
  • 是的,这就是我所说的。我假设它成功了?
  • 在不过度加权任何特定领域的情况下,我们需要进行一些试验才能正确地获得权重,但它确实工作得很好。
  • 链接已失效。 Try this
  • 我应该使用什么分析器进行精确匹配?
猜你喜欢
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多