AggregationのBucketingについて


(Masatoshi Hiraoka) #1

初めまして。

Aggregationのやり方について質問です。

ElasticsearchのDynamic Mappingを使って任意のフィールド名でindexさせようと考えています。
ただ、後々ある一定のルールで集計をかけたいため、フィールド名のprefixでバケッティング後、
集計できないかと思い、方法を探しています。

あくまで例なのですが、例えば

PUT aggregation_test/factor/1
{
  "text_name": "taro"
}

PUT aggregation_test/factor/2
{
  "text_address": "tokyo"
}

PUT aggregation_test/factor/3
{
  "radio_gender": "male"
}

PUT aggregation_test/factor/4
{
  "select_hobby": [ "car", "bike" ]
}

上記のようなデータに対してフィールドがtext_で始まるドキュメントを
バケッティングした状態で各データに対して集計をかけたい場合にどうすれば良いでしょうか?

実際には希望通りには動きませんが、イメージ的には下記のような感じです。

GET aggregation_test/factor/_search
{
  "aggs": {
    "form_values": {
      "terms": {
        "field": "text_*"
      }
    }
  }
}

これに対して

"aggregations": {
  "form_values": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
        {
           "key": "taro",
           "doc_count": 1
        },
        {
           "key": "tokyo",
           "doc_count": 1
        }
     ]
  }
}

このようなデータが返ってきてほしいのですが・・・。

Elasticsearch自体の勉強不足で、うまく説明できていないかもしれませんが、
もし解決策をお持ちの方がいらっしゃいましたらご教示いただけますと幸いです。

宜しくお願い致します。


(Jun Ohtani) #2

はじめまして、@johtaniです。

こちらにも記載がありますが、複数のフィールドをまとめるのは現時点ではサポートしていません。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#_multi_field_terms_aggregation

データを入れ直すことができるのであれば、copy_toを活用して、集計するための1つのフィールドに入れていただくのが良いかと思います。


(Masatoshi Hiraoka) #3

@johtaniさん、 ご回答ありがとうございます!

やはり対応されていないのですね。。
ドキュメントの読み込みも足りておらず、お手数をおかけ致しました。

まだデータは入っておらず、データの入れ方に関しては考慮の余地がありますので、
その方面から考え直してみようかと思います。

ご丁寧にありがとうございました。
大変勉強になりました!


(system) #4