2014-09-25 33 views
1

我们的索引文档没有完全固定的模式,也就是说,并非每个字段都在每个文档中。有没有一种方法可以基于一组文档中的字段(即对查询做出响应)创建存储区,并计算多少个文档包含这些字段?举例来说,我只是做了这些文件包括查询的结果:使用Elasticsearch按字段出现在退回文档中

{"name":"Bob","field1":"value","field2":"value2","field3":"value3"} 
{"name":"Sue","field2":"value4","field3":"value5"} 
{"name":"Ali","field1":"value6","field2":"value7"} 
{"name":"Joe","field3":"value8"} 

这是我想提取的信息(不格式):

name: 4 
field1: 2 
field2: 3 
field3: 3 

有没有一种方法可以让我聚合并计数以获得这些结果?

回答

1

是啊,我觉得你可以做这样的:

GET /some_index/some_type/_search?search_type=count 
{ 
    "aggs": { 
    "name_bucket": { 
     "filter" : { "exists" : { "field" : "name" } } 
    }, 
    "field1_bucket": { 
     "filter" : { "exists" : { "field" : "field1" } } 
    }, 
    "field2_bucket": { 
     "filter" : { "exists" : { "field" : "field2" } } 
    }, 
    "field3_bucket": { 
     "filter" : { "exists" : { "field" : "field3" } } 
    } 
    } 
} 

,你会得到这样的事情:

"aggregations": { 
     "field3_bucket": { 
     "doc_count": 3 
     }, 
     "field1_bucket": { 
     "doc_count": 2 
     }, 
     "field2_bucket": { 
     "doc_count": 3 
     }, 
     "name_bucket": { 
     "doc_count": 4 
     } 
    } 
+0

谢谢,我给一个去。我一直在寻找脚本作为动态发现字段名称的手段,但这更直接。我们的模式不是随机的,所以我们知道可能的字段集合,即使每个文档都没有每个字段。 – Paul 2014-09-26 12:06:25

相关问题