我有一个主查询,我需要几个子查询的匹配数。
换句话说,我需要一个facet.query。我缺少的是一个简单的doc_count
聚合,如value_count aggregation。
有什么建议吗?
我发现了两种我不喜欢的解决方案:
_id
上使用filter aggregation指标{/ 3}} 示例:
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。
但回到我的基本问题:弹性搜索中solr facet.query
的对应部分是什么?
答案 0 :(得分:2)
您可以使用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
聚合也应该有效。