我有一个主查询,我需要几个子查询的匹配数。
用 solr 的话来说,我需要一个 facet.query 。我缺少的是一个简单的 doc_count
聚合,例如 value_count aggregation .
有什么建议吗?
我发现了两种我不喜欢的可能解决方案:
- 使用filter aggregation与 value_count
_id
的指标:
示例:
GET _search
{
"query": {
"match_main": {}
},
"aggs": {
"facetvalue1": {
"filter": {
"bool": {
"should": [
{"match": { "name": "fred" }},
{"term": { "lastname": "krueger" }}
]
}
},
"aggs": {
"count": {
"value_count": {
"field": "_id"
}
}
}
},
"facetvalue2": {
"filter": {
"term": { "name": "freddy" }
},
"aggs": {
"count": {
"value_count": {
"field": "_id"
}
}
}
}
}
}
示例:
GET _msearch
{"index":"myindex"}
{"query":{"match_main": {}}}
{"index":"myindex"}
{"size": 0, "query":{"match_main": {}}, "filter": {"bool": {"should":[{"match": { "name": "fred" }},{"term": { "lastname": "krueger" }}]}}}
{"index":"myindex"}
{"size": 0, "query":{"match_main": {}},"filter": {"term": { "name": "freddy" }}}
我发现解决方案 2 更快,但将 match_main
想象为复杂的查询!
因此,如果有 doc_count:{}
而不是 value_count:{"field":"_id"}
,我更喜欢解决方案 1。
但回到我的基本问题:elasticsearch 中 solr facet.query
的对应部分是什么?
最佳答案
您可以使用 filters aggregation
为了这。请注意附加的 s
,它与您已经提到的 filter
聚合不同。
{
"query": {
"match_all": {}
},
"size": 0,
"aggs": {
"values": {
"filters": {
"filters": {
"value1": {
"bool": {
"should": [
{
"match": {
"name": "fred"
}
},
{
"term": {
"lastname": "krueger"
}
}
]
}
},
"value2": {
"term": {
"name": "freddy"
}
}
}
}
}
}
}
这将返回类似的内容
"aggregations": {
"values": {
"buckets": {
"value1": {
"doc_count": 4
},
"value2": {
"doc_count": 1
}
}
}
}
编辑:作为一般说明,您不必在存储桶聚合上使用指标聚合。如果您不提供任何子聚合,您将仅获得文档计数。在这种情况下,filters
将提供存储桶,但多个 filter
聚合也应该可以工作。
关于elasticsearch - 通过 Elasticsearch 中的查询进行文档计数聚合(如 solr 中的facet.query),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38122885/