我正在尝试列出聚合上的所有存储桶,但它似乎只显示前10个。
我的搜索:
curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
"size": 0,
"aggregations": {
"bairro_count": {
"terms": {
"field": "bairro.raw"
}
}
}
}'
返回:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 16920,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"bairro_count" : {
"buckets" : [ {
"key" : "Barra da Tijuca",
"doc_count" : 5812
}, {
"key" : "Centro",
"doc_count" : 1757
}, {
"key" : "Recreio dos Bandeirantes",
"doc_count" : 1027
}, {
"key" : "Ipanema",
"doc_count" : 927
}, {
"key" : "Copacabana",
"doc_count" : 842
}, {
"key" : "Leblon",
"doc_count" : 833
}, {
"key" : "Botafogo",
"doc_count" : 594
}, {
"key" : "Campo Grande",
"doc_count" : 456
}, {
"key" : "Tijuca",
"doc_count" : 361
}, {
"key" : "Flamengo",
"doc_count" : 328
} ]
}
}
}
我有超过10个密钥用于此聚合。在这个例子中,我有145个键,我想要每个键的计数。桶上有一些分页吗?我可以得到所有这些吗?
我正在使用Elasticsearch 1.1.0
答案 0 :(得分:165)
size param应该是术语查询示例的参数:
curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
"size": 0,
"aggregations": {
"bairro_count": {
"terms": {
"field": "bairro.raw",
"size": 0
}
}
}
}'
正如文档中所述仅适用于版本1.1.0以后
根据@PhaedrusTheGreek评论更新答案。
设置size:0
在2.x之后已弃用,原因是群集上存在高基数字段值的内存问题。您可以在github issue here中阅读更多相关信息。
建议为size
明确设置一个介于1到2147483647之间的数字的合理值。
答案 1 :(得分:21)
如何显示所有存储桶?
{
"size": 0,
"aggs": {
"aggregation_name": {
"terms": {
"field": "your_field",
"size": 10000
}
}
}
}
请注意
"size":10000
获取最多10000个桶。默认值为10.
"size":0
结果,"hits"
默认包含10个文档。我们不需要它们。
默认情况下,存储桶按doc_count
的顺序排序。
为什么会出现
Fielddata is disabled on text fields by default
错误?
因为fielddata is disabled on text fields by default。如果您没有明确选择字段类型映射,则它具有default dynamic mappings for string fields。
因此,您需要拥有"field": "your_field"
。
"field": "your_field.keyword"
答案 2 :(得分:5)
如果您想获取所有唯一值而不设置任何魔法数字(size: 10000
),请使用COMPOSITE AGGREGATION(ES 6.5 +)。
”如果要检索嵌套术语聚合中的所有术语或术语的所有组合,则应使用 COMPOSITE AGGREGATION ,它允许对所有可能的术语进行分页,而不是设置大小大于术语“聚合”中字段的基数。术语“聚合”是要返回最高级的术语,并且不允许分页。”
JavaScript中的实现示例:
const ITEMS_PER_PAGE = 1000;
const body = {
"size": 0, // Returning only aggregation results: https://www.elastic.co/guide/en/elasticsearch/reference/current/returning-only-agg-results.html
"aggs" : {
"langs": {
"composite" : {
"size": ITEMS_PER_PAGE,
"sources" : [
{ "language": { "terms" : { "field": "language" } } }
]
}
}
}
};
const uniqueLanguages = [];
while (true) {
const result = await es.search(body);
const currentUniqueLangs = result.aggregations.langs.buckets.map(bucket => bucket.key);
uniqueLanguages.push(...currentUniqueLangs);
const after = result.aggregations.langs.after_key;
if (after) {
// continue paginating unique items
body.aggs.langs.composite.after = after;
} else {
break;
}
}
console.log(uniqueLanguages);
答案 3 :(得分:2)
在术语聚合中将大小(第二个大小)增加到10000,您将获得大小为10000的存储桶。默认情况下,它设置为10。 另外,如果要查看搜索结果,只需将1st大小设为1,就可以看到1个文档,因为ES确实支持搜索和聚合。
curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
"size": 1,
"aggregations": {
"bairro_count": {
"terms": {
"field": "bairro.raw",
"size": 10000
}
}
}
}'
答案 4 :(得分:1)
但顺便说一下,恩 https://github.com/elasticsearch/elasticsearch/issues/1776
于6月22日关闭,我的弹性搜索在当天下载并安装, 所以假设如果有最新版本,你可以得到它