背景:
在我的ElasticSearch索引中,我有两种类型的文档,可以识别为“bvi_ship”和“bvi_notify”。标识为“bvi_ship”的每个文档还应具有标识为“bvi_notify”的相应文档。
问题:
哪种方法可以识别没有“bvi_notify”文档的“bvi_ship”文档?
使用Facet :
我已经能够使用以下分面代码识别必要的文档:
{
"size":0,
"query":{
"filtered":{
"query":{
"query_string":{
"default_operator":"OR",
"default_field":"_all",
"query":"@fields.action:\"bv_ship\" OR @fields.action:\"bvi_notify\""
}
}
}
},
"facets":{
"terms":{
"terms":{
"field":[
"@fields.object"
],
"size":1000
}
}
}
}
返回如下所示的结果:
{
"took" : 147,
...
},
"hits" : {
...
},
"facets" : {
"terms" : {
...
"terms" : [ {
"term" : "xml",
"count" : 1443
}, {
"term" : "content_ff47d2d096ea4510ac0895941666e507",
"count" : 2
}, {
"term" : "content_fa525becb2724b7682df278c02fed308",
"count" : 2
},
... THOUSANDS OF RECORDS WITH COUNT of 2
}, {
"term" : "content_f1ff2f7440534a08bad4c62b92165949",
"count" : 1
} ]
}
}
}
这个可以运行良好,但是当我真的只对数量为1的记录感兴趣时,我显然不希望返回数千个计数为2的记录。 / p>
有没有办法限制分面搜索,以便它只返回计数为1的记录?
使用过滤器:
我猜我应该能够在我的查询中更加具体,只需使用查询和过滤器的组合选择适当的记录,尽管我的ElasticSearch Kung-Fu受到我的关系数据库空手道的限制。
答案 0 :(得分:0)
我认为最好的方法是使用'bvi_notify'对象作为'bvi_ship'对象的记录子对象来记录索引。然后,您就可以在must_not
过滤器的bool
子句中使用has_child过滤器来查找没有相应“bvi_notify”对象的所有“bvi_ship”文档。
要回答原始问题,无法将术语构面限制为仅计数为1的术语,但您可以使用reverse_count
顺序对构面进行排序,这将使所有条件的计数为1最重要的。但是,我还应该提一下,如果你有超过1个碎片,那么你在方面得到的计数might be incorrect。这是我建议使用父/子解决方案而不是方面的另一个原因。