elasticsearch匹配搜索查询中文档中的所有单词

时间:2015-09-15 07:36:23

标签: elasticsearch

我们可以搜索特定文档中的所有单词。这样的字段:

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

这将在字段Black中搜索单词NikeMenstitle,以便只返回那些将在{title中包含所有这些单词的文档{1}}字段。

但我想做的事情有点不同。

我想查找,如果文档的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这个词

这是一种反向和操作员搜索

这可能吗?如果是,那怎么办?

2 个答案:

答案 0 :(得分:3)

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

这就是我的所作所为:

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

这对我很有用!

除非有人使用elasticsearch查询语言提供直接方法。

答案 1 :(得分:0)

Percolate query应该在这里有所帮助。您需要将文档注册为查询,并使用AND运算符将“ Nike Free Sparq Mens White”作为匹配查询。

然后,您的查询可以成为一个以“ Nike Free Sparq 09-男士-白色/黑色/红色”为内容的文档。您应该重新获得“ Nike Free Sparq Mens White”,因为它符合所有条件。

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