【问题标题】:elasticsearch match all words from document in the search queryelasticsearch 匹配搜索查询中文档中的所有单词
【发布时间】:2015-12-11 08:51:52
【问题描述】:

我们可以像这样搜索特定 document.field 中的所有单词:

{ "query" : { "match" : { "title": { "query" : "Black Nike Mens", "operator" : "and" } } } }

这将在title 字段中搜索单词Black、Nike 和Mens,以便仅返回那些在title 字段中包含所有这些单词的文档。

但我想做的有点不同。

我想查找,如果文档的 title 字段的所有单词都存在于我的搜索查询中,那么它将返回该文档。

例如

假设elasticsearch数据库中有title : "Nike Free Sparq Mens White"的文档

现在,如果我使用 query : "Nike Free Sparq 09 - Mens - White/Black/Varsity Red" 进行搜索,那么它应该返回此文档,因为 document.title 中的所有单词都存在于我的查询中

但如果我使用 query : "Nike Free Lebron - Mens - White/Black" 进行搜索,那么它不应该返回文档,因为我的查询缺少单词 Sparq

这是一种反向运算符搜索

这可能吗?如果是,那么如何?

【问题讨论】:

  • 看看这个链接。你会在那里找到答案:) stackoverflow.com/questions/26001002/…
  • 感谢@betto86 的帮助,它没有回答我的问题,但在更多相关的事情上帮助了我。
  • 虽然您发布了解决方法,但我也想知道更清洁的解决方案。

标签: elasticsearch


【解决方案1】:

我终于让它工作了,但不是直接的方法!

这就是我的工作:

  • 从源查询创建一个干净的单词列表,方法是:
    • 改为小写
    • 用空格替换任何特殊字符和标点符号
    • 删除重复的单词
  • 使用带有 OR 运算符的正常匹配搜索作为字符串连接的单词
  • 现在我们将在结果中找到最相关的匹配项
  • 我们将这些点击一一进行,并在 php(或您使用的任何编程语言)中进行逐字搜索
  • 这个词搜索将从我们刚刚找到的命中中检查文档的所有词,并将它们与源查询中的词匹配;这样命中文档中的所有单词都应该出现在源查询字符串中

这对我来说已经足够好了!

除非有人有来自 elasticsearch 查询语言的直接方法。

【讨论】:

    【解决方案2】:

    Percolate query 应该在这里提供帮助。您可以将文档注册为查询,使“Nike Free Sparq Mens White”成为使用 AND 运算符的匹配查询。

    然后您的查询可以变成一个文档,例如以“Nike Free Sparq 09 - Mens - White/Black/Varsity Red”为内容的文档。您应该找回“Nike Free Sparq Mens White”,因为它符合所有条款。

    不幸的是,这不会很好地扩展(例如,如果您有数百万个文档,它可能会变慢)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 2018-10-23
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      相关资源
      最近更新 更多