在我的ES中,我有一个如下的架构类型:
{
"index_v1":{
"mappings":{
"fuas":{
"properties":{
"comment":{
"type":"string"
},
"matter":{
"type":"string"
},
"metainfos":{
"properties":{
"department":{
"type":"string"
},
"processos":{
"type":"string"
}
}
}
}
}
}
}
}
不久,
fuas
类型具有两个属性comment
和matter
以及一个内部(非嵌套)对象metainfos
和几个属性department
和processos
。我想知道有多少
metainfos' fields
被告知其出现次数。想象一下一个文档
doc1
和metainfos: {department: "d1"}
以及doc2
和metainfos: {department: "d2", processos: "p1"}
。然后,我想获取:
{department: 2, processos: 1}
。编辑
作为内部对象,由于ES是无模式文档的
metainfos
内部对象,因此可以通知或不通知多个字段。因此,
doc1's metainfos {field1: 1, field3: 3}
,doc2's metainfos {field2: 1, field4: 5}
和doc3's metainfos {field1:2, field4: 2, field5: 1}
。我想要得到:
{field1: 2, field2: 1, field3: 1, field4: 2, field5: 1}
。我认为要解决的主要问题是如何能够查询我不知道的字段。我已经测试了两个文档:
{
"hits":{
"total":2,
"max_score":1.0,
"hits":[
{
"_source":{
"matter":"FUA2",
"comment":null,
"metainfos":[
{
"department":"d1"
}
]
}
},
{
"_source":{
"matter":"FUA1",
"comment":"vcvcvc",
"metainfos":[
{
"department":"d1"
},
{
"processos":"p1"
}
]
}
}
]
}
}
我已经使用以下命令对此进行了测试:
curl -XGET 'http://localhost:9201/living_team/fuas/_search?pretty' -d '
{
"size": 0,
"aggregations" : {
"followUpActivity.metainfo.department" : {
"terms" : {
"field" : "metainfos.*"
}
}
}
}
'
结果是:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"followUpActivity.metainfo.department" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [ ]
}
}
}
最佳答案
您可以为此使用 value_count
aggregation:
{
"size": 0,
"aggs" : {
"dept" : {
"value_count" : { "field" : "metainfos.department" }
},
"proc" : {
"value_count" : { "field" : "metainfos.processos" }
}
}
}
关于elasticsearch - 内部对象上的ElasticSearch聚合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37458724/