2016-04-14 17 views
0

ルートドキュメントにある数値フィールドとネストされたドキュメントにあるフィールドを組み合わせてESドキュメントをソートしようとしています。簡単にするために、私がdoc['score'] + doc['nested.score']で並べ替えたいとしましょう。ElasticSearch:親ネストされたフィールドの組み合わせに基づいてドキュメントをソート

例マッピングおよびデータ文書のカップルがここにある:http://pastebin.com/9sdMphsR

ナイーブ(間違った)アプローチ、それが直接doc['score']にアクセスしようとしたので、次のとおりです。

について移動するための正しい方法は何
POST /testing/stuff/_search 
{ 
    "query": { 
     "match_all": { 
     } 
    }, 
    "sort": { 
     "_script": { 
      "type": "number", 
      "mode": "max", 
      "script": { 
       "inline": "doc['score'].value + doc['variations.score'].value", 
       "lang": "expression" 
      }, 
      "order": "desc", 
      "nested_path": "variations" 
     } 
    } 
} 

これをする?私はルートレベルscoreを各ネストされたドキュメントにコピーすることができたことに気づいています。

答えて

0
POST /testing/stuff/_search 
{ 
    "query": { 
    "match_all": {} 
    }, 
    "sort": { 
    "_script": { 
     "type": "number", 
     "script": { 
     "inline": "def max=java.lang.Integer.MIN_VALUE; for(obj in doc['variations.score']){ if (obj > max) max = obj; }; return doc['score'].value + max", 
     "lang": "groovy" 
     }, 
     "order": "desc" 
    } 
    } 
} 

そしてvariationsフィールドネストされた値にアクセスできるようにするスクリプトの"include_in_parent": trueを持っている必要があります。

+0

ありがとうございました!しかし、それは私にとってはうまくいかないようです。これを(intの代わりに 'float 'に' max'を変更して)変更しようとすると、 'max'は常に0と評価され、戻り値は単に親の' score'になります。 'variations'はネストされたデータ型であり、単純なフィールドではありません。 – Gabriel

+0

これはどのESバージョンですか? –

+0

私は現在バージョン2.2を実行しています – Gabriel

関連する問題