背景:
在我的ElasticSearch索引中,我有两种类型的文档,可以标识为"bvi_ship"one_answers"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的记录。
有没有办法限制分面搜索,使其只返回计数为1的记录?
使用过滤器:
我想我应该能够在查询中更加具体,并简单地使用查询和过滤器的组合来选择合适的记录,尽管我的ElasticSearch功夫受到关系数据库空手道的阻碍。
我认为最好的方法是将带有"bvi_notify"对象的记录索引为带有"bwi_ship"对象记录的子级。然后,您将能够在bool
筛选器的must_not
子句中使用has_child筛选器来查找所有没有相应"bvi_notify"对象的"bvi_ship"文档。
为了回答您最初的问题,没有办法将术语facet限制为仅计数为1的术语,但您可以使用reverse_count
顺序对facet进行排序,这将使所有计数1的术语位于列表的顶部。然而,我还应该提到,如果你有一个以上的碎片,那么你在你的方面得到的计数可能是不正确的。这也是为什么我建议使用父/子解决方案而不是facets的另一个原因。