从每个Elasticsearch路线

时间:2016-01-14 18:04:47

标签: elasticsearch

我的Elasticsearch索引的路由键为day,格式为"yyyyMMdd"。每天都会添加许多新文档。在本月底,我想询问是否有任何日子由于某种原因某个来源没有添加文档。有一个source_id字段代表来源。

到目前为止我得到了它,我需要提供所有路径密钥,例如2016010120160102等,并按source_id进行过滤。但这可能会返回数百个文档,我可能需要对它们进行全部分页。

有没有办法只知道是否有一个路由密钥与给定的source_id没有匹配的文档,所以基本上我只会将31个或更少的文档返回给我的应用程序代码,所以很容易迭代并检查是否有一天没有文件。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以在Terms Aggregation字段上使用_routing来了解所有路由值的使用情况。请参阅以下查询:

POST <index>/<type>/_search
{
   "size": 0,
   "query": {
      "term": {
         "source_id": {
            "value": "VALUE" <-- Value of source_id to filter on
         }
      }
   },
   "aggs": {
      "routings": {
         "terms": {
            "field": "_routing",
            "size": 31  <-- We don't expect to get more than 31 unique _routing values
         }
      }
   }
}

对应的Nest代码如下:

var response = client.Search<object>(s => s
    .Index("<index name>")
    .Type("<type>")
    .Query(q => q
        .Term("source_id", "<source value>"))
    .Aggregations(a => a
        .Terms("routings", t => t
            .Field("_routing")
            .Size(31))));

var routings = response.Aggs.Terms("routings").Items.Select(b => b.Key);

routings将包含您需要的路由值列表。