我正在尝试在我的群集上运行一些统计信息。
有时我无法检索一个索引(或一种类型)范围内的所有文档,因为它有大量的数据流量。所以我对我的查询设置了一些限制(例如:"size": 1000
)。
结合聚合范围,我在命中范围内获得了1000个文档,并且索引中所有匹配文档的聚合结果。
这种行为是可以理解的,但由于我的统计数据的性质,我想只聚合实际检索的文档。
我知道在查询范围内有一个名为“Post-Filtering”的方法会在 计算聚合后发生。
所以,我正在搜索的是一些'后聚合',在>> 文件被检索之后发生,因此只有那些被检索的文档才会聚合。
以下是一些查询示例:
{
"size": 1000,
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"make": "ford"
}
}
]
}
}
}
},
"aggregations": {
"types": {
"terms": {
"field": "color"
}
}
}
}
在上面的查询中,我想仅在那1000个检索到的文档上获得聚合结果。
有什么建议吗?
答案 0 :(得分:0)
我想仅在这1000个检索到的文档上获得聚合结果。
简答:使用Sampler aggregation
答案很长:您可以从每个分片中获得最高 N
鉴于您的疑问:
{
"size": 1000,
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"make": "ford"
}
}
]
}
}
}
},
"aggregations": {
"types": {
"terms": {
"field": "color"
}
}
}
}
添加Sampler后,聚合将如下所示:
{
"size": 1000,
"query": {
"filtered": {
"filter": {
"bool": {
"must": [{
"term": {
"make": "ford"
}
}]
}
}
}
},
"aggregations": {
"sample": {
"sampler": {
"shard_size": 200
},
"aggs": {
"types": {
"terms": {
"field": "color"
}
}
}
}
}
}
注意"shard_size": 200
- 默认值为100.如果您有5个分片(ES中默认),您将获得总共5 * 200 = 1000个结果