我正在寻找一种在弹性搜索中进行精确数组匹配的方法。假设这些是我的文档:
{"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)
有什么聪明的方法来解决这个问题吗?
发布于 2012-10-02 00:38:18
如果您有一组离散的已知类别,则可以使用布尔查询:
"bool" : {
"must" : {
"terms" : { "categories" : ["c", "d"],
minimum_should_match : 2
}
},
"must_not" : {
"terms" : { "categories" : ["a", "b", "e"],
minimum_should_match : 1
}
}
}
否则,我认为实现这一点的最简单方法是存储另一个字段作为类别关键字。
{"id": 1, "categories" : ["c", "d"], "categorieskey" : "cd"}
差不多吧。然后,您可以很容易地使用术语查询来精确地查询您想要的结果,例如:
term { "categorieskey" : "cd" }
你仍然可以进行非排他性的搜索,比如;
term { "categories" : "c" }
查询两个必须同时存在的类别很容易,但随后阻止任何其他潜在类别出现就有点难了。也许你能做到。您可能希望编写一个查询来查找具有这两个记录的记录,然后对其应用筛选器,以消除除指定类别之外的所有记录。据我所知,Lucene实际上并不是为处理这种搜索而设计的。
老实说,我在这里想出一个好的过滤器有点麻烦。您可能需要脚本筛选器,或者可以在检索到结果后对其进行筛选。
发布于 2013-03-21 22:44:34
我为我们的用例找到了一个似乎可行的解决方案。它依赖于两个过滤器和我们想要匹配的类别的知识。我们使用术语筛选器和脚本筛选器来检查数组的大小。在本例中,marketBasketList类似于您的categories条目。
{
"query": {
"bool": {
"must": [
{
"match": {
"siteId": 4
}
},
{
"match": {
"marketBasketList": {
"query": [
10,
11
],
"operator": "and"
}
}
}
]
},
"boost": 1,
"filter": {
"and": {
"filters": [
{
"script": {
"script": "doc['marketBasketList'].values.length == 2"
}
},
{
"terms": {
"marketBasketList": [
10,
11
],
"execution": "and"
}
}
]
}
}
}
}
https://stackoverflow.com/questions/12676234
复制相似问题