2

背景

在我的 ElasticSearch 索引中,我有两种类型的文档可以识别为“bvi_ship”和“bvi_notify”。每个被标识为“bvi_ship”的文档也应该有一个对应的文档被标识为“bvi_notify”。

问题

识别没有“bvi_notify”文档的“bvi_ship”文档的适当方法是什么?

使用方面

我已经能够使用以下分面代码识别必要的文档:

{
   "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 受到我的关系数据库空手道的限制。

4

1 回答 1

0

我认为最好的方法是将具有“bvi_notify”对象的记录作为具有“bvi_ship”对象的记录的子项进行索引。然后,您将能够在过滤器的子句中使用has_child过滤器来查找所有没有相应“bvi_notify”对象的“bvi_ship”文档。must_notbool

要回答您的原始问题,无法将术语方面限制为仅计数为 1 的术语,但您可以使用 order 对方面进行reverse_count排序,这会将计数为 1 的所有术语置于列表顶部。但是,我还应该提到,如果您有超过 1 个分片,那么您在构面中获得的计数可能是不正确的。这是我建议使用父/子解决方案而不是方面的另一个原因。

于 2013-07-20T00:48:01.920 回答