通过 Elasticsearch 中的查询进行文档计数聚合(如 solr 中的 facet.query)
Document count aggregation via query in Elasticsearch (like facet.query in solr)
我有一个主查询,我需要几个子查询的匹配数。
用 solr 的话我需要一个 facet.query. What I am missing is a simple doc_count
aggregation like the value_count aggregation.
有什么建议吗?
我发现了两个我不喜欢的可能解决方案:
- 在
_id
上使用 filter aggregation with value_count 指标:
示例:
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"
}
}
}
}
}
}
}
这将return类似于
"aggregations": {
"values": {
"buckets": {
"value1": {
"doc_count": 4
},
"value2": {
"doc_count": 1
}
}
}
}
编辑:一般来说,您不必对存储桶聚合使用度量聚合。如果您不提供任何子聚合,您将只获得文档计数。在这种情况下,filters
将提供存储桶,但多个 filter
聚合也应该起作用。
我有一个主查询,我需要几个子查询的匹配数。
用 solr 的话我需要一个 facet.query. What I am missing is a simple doc_count
aggregation like the value_count aggregation.
有什么建议吗?
我发现了两个我不喜欢的可能解决方案:
- 在
_id
上使用 filter aggregation with value_count 指标:
示例:
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"}
.
但是回到我的基本问题: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"
}
}
}
}
}
}
}
这将return类似于
"aggregations": {
"values": {
"buckets": {
"value1": {
"doc_count": 4
},
"value2": {
"doc_count": 1
}
}
}
}
编辑:一般来说,您不必对存储桶聚合使用度量聚合。如果您不提供任何子聚合,您将只获得文档计数。在这种情况下,filters
将提供存储桶,但多个 filter
聚合也应该起作用。