显示所有Elasticsearch聚合结果/存储桶,而不仅仅是10个


164

我正在尝试列出聚合中的所有存储桶,但似乎只显示了前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

Answers:


195

size参数应该是术语查询示例的参数:

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 问题中阅读有关它的更多信息。

建议为size1到2147483647之间的数字明确设置合理的值。


8
请注意,由于使用高基数字段值在群集上造成的内存问题,现在不建议使用设置大小:0。 github.com/elastic/elasticsearch/issues/18838。相反,请使用介于1到2147483647之间的真实,合理的数字
。– PhaedrusTheGreek

感谢@PhaedrusTheGreek指出这个问题,我编辑了答案以纳入您的评论。
keety

0正在处理2.5.2。从2.x开始意味着什么?在版本5之后是什么意思?我也很好奇,如果我想返回所有可能的aggs,会导致什么样的内存问题,设置0(max_value)和10000(某个较大的上限)之间会有什么区别?
batmaci

4
@batmaci,它已在2.x中弃用,因此仍然可以使用,并已从5.x
keety

@batmaci我相信size:<big number>的使用不会减少内存密集性,但只会向客户端更明确地表明存在性能成本。我认为这是过时的原因size:0。您可以在此github 问题中
keety

37

如何显示所有水桶?

{
  "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。如果您尚未明确选择字段类型映射,则它具有字符串字段默认动态映射

因此,无需编写,而"field": "your_field"需要编写"field": "your_field.keyword"


存储桶的大小是否会影响弹性搜索查询的性能(运行查询的时间)?
user3522967

我们如何为水桶添加分页?
Miind

7

在术语聚合中将大小(第二个大小)增加到10000,您将获得大小为10000的存储桶。默认情况下,它的大小设置为10。此外,如果要查看搜索结果,只需将第一个大小设为1,即可请参阅1文档,因为ES确实支持搜索和聚合。

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 1,
   "aggregations": {
      "bairro_count": {
         "terms": {
             "field": "bairro.raw",
             "size": 10000

         }
      }
   }
}'

3

如果要获取所有唯一值而无需设置幻数(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);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.