Elasticsearchの集計結果/バケットを10個だけでなくすべて表示する


165

集約のすべてのバケットを一覧表示しようとしていますが、最初の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を使用しています

回答:


196

サイズパラメータは、用語クエリの例のパラメータである必要があります。

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
カーディナリティの高いフィールド値を持つクラスターでメモリの問題が発生したため、size:0の設定は廃止されました。 github.com/elastic/elasticsearch/issues/18838。代わりに、1から2147483647までの実際の適切な数値を使用してください。–
PhaedrusTheGreek

これを指摘してくれて@PhaedrusTheGreekに感謝します。コメントを組み込むために回答を編集しました。
キーティー

0は2.5.2に取り組んでいます。2.x以降とはどういう意味ですか?バージョン5以降はどういう意味ですか?また、考えられるすべての集計を返したい場合に、どのようなメモリの問題が発生する可能性があるのか​​について知りたいのですが、0(max_value)と10000(いくつかの大きな上限)の設定の違いは何ですか?
batmaci 2017

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が無効になっているためです。フィールドタイプマッピングをwxplicitlyに選択していない場合は、文字列フィールドのデフォルトの動的マッピングがあります

したがって、書く代わりに"field": "your_field"が必要"field": "your_field.keyword"です。


バケットのサイズが大きくなると、エラスティック検索クエリのパフォーマンス(クエリを実行する時間)に影響しますか?
user3522967

バケットの改ページを追加するにはどうすればよいですか?
Miind

7

用語の集計でサイズ(2番目のサイズ)を10000に増やすと、サイズ10000のバケットが取得されます。デフォルトでは10に設定されています。また、検索結果を表示したい場合は、1番目のサイズを1に設定するだけです。 ESは検索と集計の両方をサポートしているため、1つのドキュメントを参照してください。

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);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.