2016-04-05 8 views
3

私はこのような調査データを格納しています:Elasticsearch:調査データから分布表を生成

[ 
    { 
    "userid":1, 
    "answers":[ 
     { 
     "key":"gender", 
     "value":"male" 
     }, 
     { 
     "key":"color", 
     "value":"red" 
     }, 
     { 
     "key":"vehicle", 
     "value":"car" 
     } 
    ] 
    }, 
    { 
    "userid":2, 
    "answers":[ 
     { 
     "key":"gender", 
     "value":"female" 
     }, 
     { 
     "key":"color", 
     "value":"blue" 
     }, 
     { 
     "key":"vehicle", 
     "value":"bike" 
     } 
    ] 
    }, 
    ...... 
] 

マッピングは同様である。別の質問の多くが付いているユーザーの多くを意味

"users" : { 
    "properties" : { 
     "userid" : { 
      "type" : "long" 
     }, 
     "answers" : { 
      "type" : "nested", 
      "properties" : { 
       "key" : { 
        "type" : "string", 
        "index" : "not_analyzed" 
       }, 
       "value" : { 
        "type" : "string", 
        "index" : "not_analyzed" 
       } 
      } 
     } 
    } 
} 

。どのような質問があったかについて柔軟に対応しなければならないので、私はキー/バリュースタイルを選択しました。

私はジェンダーと色に関する分布表を私に与えるクエリを探したいと思います。 意味:性別を軸に、色を軸として、これらのフィールドにすべての可能な用語を表示する2次元表。 私は色の赤のような女性の数や青のような男性の数について素敵な概要を知りたいです。

ネストされたフィルタリングされた条件の集計で多くを試しましたが、まだ成功しませんでした。集計クエリを構築する方法について

任意のヒントは...

+0

あなたはこれらのユーザーの回答を格納するためにあなたが持っているマッピングを共有することができていることを確認してください? – eemp

+0

マッピングを含む投稿を更新しました... – shizzler

+0

質問を投稿しているので、この構造が柔軟性がないと仮定して正しいですか? '{" userid ":1、" color ":" red "、" gender ":" male "}'のようなレコードを格納することは、あなたが切り替えることができないことですか?それは集約と応答をはるかに良くするでしょう。 – eemp

答えて

2

をいただければ幸いあなたはscripted metric aggregation

一般的に、それはこのようになりますチェックすることができます。私はあなたの特定のケースのために

POST documents/_search 
{ 
    "aggs": { 
    "distribution": { 
     "scripted_metric": { 
     "init_script": "initializations", 
     "map_script": "build partial distribution for single document", 
     "combine_script": "", 
     "reduce_script": "summarize all partial distributions to final grid" 
     } 
    } 
    } 
} 

を次のクエリを提案できます

POST test/example/_search 
{ 
    "size": 0, 
    "aggs": { 
    "distribution": { 
     "scripted_metric": { 
       "init_script" : "_agg['variants'] = [:]", 
       "map_script" : "gender='';color=''; for (answer in _source.answers){ if(answer.key=='gender'){gender=answer.value};if(answer.key=='color'){color=answer.value} }; if(gender!='' && color!=''){key=(gender+'-'+color); _agg['variants'][key]=_agg['variants'].get(key,0)+1}", 
       "combine_script" : "return _agg.variants", 
       "reduce_script" : "result=[:]; for (a in _aggs) {a.each{k,v -> result[k]=result.get(k,0)+v} }; return result;" 
      } 
    } 
    } 
} 

この

{ 
    "took": 32, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 7, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "distribution": { 
     "value": { 
     "female-yelow": 4, 
     "male-red": 1, 
     "female-blue": 1, 
     "male-blue": 1 
     } 
    } 
    } 
} 

ような何かを回すあなたはサーバ設定でscripting enabled

user:/etc/elasticsearch# head elasticsearch.yml 
script.inline: true 
script.indexed: true 
... 
+0

ありがとうございます。スクリプト化されていないソリューションはありませんか?私は公式の方法を探しています、何らかの方法が必要です! – shizzler

+1

あなたのデータ構造では、私が考えることができる唯一のことは2つのネスト化された値フィールド別のフィールドです。この場合、すべての値は一意である必要があります(または区別できない)ため、アプリ側で余分な処理が必要になります。 – pkhlop

+0

スクリプト化されていないソリューションはどのように見えますか?セキュリティとパフォーマンスの理由から、スクリプトを使用したくない... – shizzler

関連する問題