背景:
在我的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的记录。
有没有一种方法可以限制分面搜索,使其仅返回计数为1的记录?
使用过滤器:
我想我应该能够在查询中更加具体,并且可以使用查询和过滤器的组合来选择适当的记录,尽管我的ElasticSearch Kung-Fu受到我的关系数据库空手道的阻碍。
最佳答案
我认为最好的方法是将带有“bvi_notify”对象的记录索引为带有“bvi_ship”对象的记录的子对象。然后,您将能够在must_not
过滤器的bool
子句中使用has_child过滤器来查找所有没有相应“bvi_notify”对象的“bvi_ship”文档。
要回答您的原始问题,没有办法将术语方面限制为仅计数为1的术语,但是您可以使用reverse_count
顺序对方面进行排序,这会将所有计数为1的术语置于列表的顶部。但是,我还要提到的是,如果分片超过1个,则分面might be incorrect中获得的计数。这是为什么我建议使用父/子解决方案而不是方面的另一个原因。
关于elasticsearch - 如何在ElasticSearch中识别丢失的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17749442/