Elasticsearch で aggs を用いた facet 検索
Elasticsearch で特定の属性を指定せずに aggs でファセット検索を行う方法のメモ。
features に属性毎に key、value を持たせていますが、
検索する際にはファセットを表示する際の属性名(name)、選択肢(option)を使用します。
■インデックス定義
■データ例
■検索
■検索結果
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 } ] } } ] } } } }