我有以下简单的ElasticSearch查询:
{
"query": {
"term": {
"categories": "1234"
}
}
}
返回包含如下结构的许多文档:
{
"properties": [
{
"name": "foo",
"value": 20
},
{
"name": "bar",
"value": 30
}
]
}
如何更改上述查询,以便ElasticSearch在properties.name
中返回所有结果文档共有的一组值?
答案 0 :(得分:2)
使用简单查询无法执行此操作。其中一个解决方案是使用a term aggregation,如下所示:
{
"query": {
"term": {
"categories": "1234"
}
},
"aggs": {
"properties_name": {
"terms": {
"field": "properties.name"
}
}
}
}
你会得到类似的回应:
{
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 10,
"hits": [{...}]
}
"aggregations": {
"properties_name": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [{
"key": "foo",
"doc_count": 10
}, {
"key": "bar",
"doc_count": 4
}, {}]
}
}
}
您可以在hits
下获得常规结果,并在aggregations
下获得汇总结果。
然后你可以使用hits.total(10)来查找所有文档中都存在的properties_names。您只需要遍历存储桶,并使用doc_count == hits.total
保留存储桶在此示例中,所有文档中仅存在“foo”属性