dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

Elasticsearch で aggs を用いた facet 検索

2022-12-04 11:54:28 | elasticsearch
Elasticsearch で aggs を用いた facet 検索

Elasticsearch で特定の属性を指定せずに aggs でファセット検索を行う方法のメモ。
features に属性毎に key、value を持たせていますが、
検索する際にはファセットを表示する際の属性名(name)、選択肢(option)を使用します。

■インデックス定義
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "id": {
        "type": "keyword",
        "store": "true"
      },
      "features": {
        "type": "nested",
        "properties": {
          "key": {"type": "keyword"},
          "name": {"type": "keyword"},
          "value": {"type": "keyword"},
          "option": {"type": "keyword"}
        }
      }
    }
  }
}

■データ例
{ 
  "id": "doc_1",
  "features": [
    {"key": "maker",
     "value": "aaa",
     "name": "メーカー",
     "option": "AAA社"},
    {"key": "material",
     "value": "gold",
     "name": "材質",
     "option": "ゴールド"},
    {"key": "price",
     "value": "2500",
     "name": "価格",
     "option": "2,001円 ~ 3,000円"}
  ]
}

■検索
{
  "size": 0,
  "aggs": {
    "keys": {
      "nested": {
        "path": "features"
      },
      "aggs": {
        "by_name": {
          "terms": {
            "field": "features.name",
            "size": 5
          },
          "aggs" : {
            "by_option": {
              "terms": {
                "field": "features.option",
                "size": 5
              }
            }
          }
        }
      }
    }
  }
}

■検索結果
{
  ...,
  "aggregations" : {
    "keys" : {
      "doc_count" : 18,
      "by_name" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : "メーカー",
            "doc_count" : 6,
            "by_option" : {
              "doc_count_error_upper_bound" : 0,
              "sum_other_doc_count" : 0,
              "buckets" : [
                {
                  "key" : "AAA社",
                  "doc_count" : 2
                },
                {
                  "key" : "BBB社",
                  "doc_count" : 2
                },
                {
                  "key" : "CCC社",
                  "doc_count" : 2
                }
              ]
            }
          },
          {
            "key" : "価格",
            "doc_count" : 6,
            "by_option" : {
              "doc_count_error_upper_bound" : 0,
              "sum_other_doc_count" : 0,
              "buckets" : [
                {
                  "key" : "1,001円 ~ 2,000円",
                  "doc_count" : 3
                },
                {
                  "key" : "2,001円 ~ 3,000円",
                  "doc_count" : 2
                },
                {
                  "key" : "~ 1,000円",
                  "doc_count" : 1
                }
              ]
            }
          },
          {
            "key" : "材質",
            "doc_count" : 6,
            "by_option" : {
              "doc_count_error_upper_bound" : 0,
              "sum_other_doc_count" : 0,
              "buckets" : [
                {
                  "key" : "ゴールド",
                  "doc_count" : 2
                },
                {
                  "key" : "シルバー",
                  "doc_count" : 2
                },
                {
                  "key" : "スチール",
                  "doc_count" : 1
                },
                {
                  "key" : "ブロンズ",
                  "doc_count" : 1
                }
              ]
            }
          }
        ]
      }
    }
  }
}


この記事についてブログを書く
« python で list の要素を置換 | トップ | Elastcisearch でフィールド... »

elasticsearch」カテゴリの最新記事