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

Sam*_*zzo 143 aggregation elasticsearch

我试图在聚合上列出所有桶,但它似乎只显示前10个.

我的搜索:

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 0, 
   "aggregations": {
      "bairro_count": {
         "terms": {
            "field": "bairro.raw"
         }
      }
   }
}'
Run Code Online (Sandbox Code Playgroud)

返回:

{
  "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
      } ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我有超过10个密钥用于此聚合.在这个例子中,我有145个键,我想要每个键的计数.桶上有一些分页吗?我可以得到所有这些吗?

我正在使用Elasticsearch 1.1.0

kee*_*ety 181

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

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 0,
   "aggregations": {
      "bairro_count": {
         "terms": {
            "field": "bairro.raw",
             "size": 0
         }
      }
   }
}'
Run Code Online (Sandbox Code Playgroud)

正如文档中所提到的仅适用于1.1.0版本

编辑

根据@PhaedrusTheGreek评论更新答案.

设置size:0在2.x以后已弃用,原因是群集上存在高基数字段值的内存问题.您可以在github 问题中阅读更多相关信息.

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

  • 请注意,由于群集中存在高基数字段值导致的​​内存问题,现在不推荐使用设置大小:0.https://github.com/elastic/elasticsearch/issues/18838.相反,请使用介于1到2147483647之间的实数,合理的数字. (7认同)
  • @batmaci它被弃用[2.X(https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-aggregations-bucket-terms-aggregation.html#_size),所以仍然能工作并从[5.x]中删除(https://www.elastic.co/guide/en/elasticsearch/reference/current/breaking_50_aggregations_changes.html) (4认同)

sam*_*sam 27

如何显示所有桶?

{
  "size": 0,
  "aggs": {
    "aggregation_name": {
      "terms": {
        "field": "your_field",
        "size": 10000
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

注意

  • "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".


Hil*_*hka 11

如果您想在不设置幻数 ( 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);
Run Code Online (Sandbox Code Playgroud)


won*_*der 5

在术语聚合中将大小(第二个大小)增加到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

         }
      }
   }
}'
Run Code Online (Sandbox Code Playgroud)