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

时间:2014-04-08 03:41:33

标签: elasticsearch aggregation

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

5 个答案:

答案 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 +)

来自official documentation

”如果要检索嵌套术语聚合中的所有术语或术语的所有组合,则应使用 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日关闭,我的弹性搜索在当天下载并安装, 所以假设如果有最新版本,你可以得到它