使用elasticsearch在数组对象类型中进行精确搜索
我正在寻找一种在elasticsearch中进行 数组匹配的方法。假设这些是我的文件:
{"id": 1, "categories" : ["c", "d"]}{"id": 2, "categories" : ["b", "c", "d"]}
{"id": 3, "categories" : ["c", "d", "e"]}
{"id": 4, "categories" : ["d"]}
{"id": 5, "categories" : ["c", "d"]}
有没有一种方法可以搜索所有类别 的“ c”和“ d”文档(文档1和5)?
另外,搜索“其中一个”类别还是应该可行的(例如,您可以搜索“ c”并获得1、2、3和5)
有解决这个问题的聪明方法吗?
回答:
如果您有一组离散的已知类别,则可以使用布尔查询:
"bool" : { "must" : {
"terms" : { "categories" : ["c", "d"],
minimum_should_match : 2
}
},
"must_not" : {
"terms" : { "categories" : ["a", "b", "e"],
minimum_should_match : 1
}
}
}
否则,我认为,可能最简单的方法是存储另一个用作category关键字的字段。
{"id": 1, "categories" : ["c", "d"], "categorieskey" : "cd"}
这样的事情。然后,您可以轻松地通过术语查询查询所需的精确结果,例如:
term { "categorieskey" : "cd" }
而且,您仍然可以非排他性地搜索,例如:
term { "categories" : "c" }
查询必须都存在的两个类别很容易,但是要阻止其他任何潜在类别的存在就比较困难。您可能会做到。您可能想编写一个查询来查找包含这两个记录的查询,然后对其应用过滤器,以消除所有类别与指定类别不同的记录。据我所知,Lucene并不是真正为处理这种搜索而设计的。
老实说,我在使用一个好的过滤器时遇到了麻烦。您可能需要脚本过滤器,或者可以在检索结果之后过滤结果。
以上是 使用elasticsearch在数组对象类型中进行精确搜索 的全部内容, 来源链接: utcz.com/qa/435118.html