2016-04-18 9 views
2

弾性検索 - 行方不明のパラメータを持つ複数のフィールドで並べ替え、私は2つの異なるフィールドによって弾性検索クエリに並べ替えを適用しようとしています

price_soldprice_list

私が最初にソートするprice_soldしたいと思います

"sort": [ 
{ "price_sold": { "order": "desc"}}, 
{ "price_list": { "order": "desc"}} 
] 
:その値がnullの場合、しかし、私はちょうどに種類を設定した場合、その後ソート price_list

によってクエリが正しいだろうしたいと思います

私はクエリを実行しましたが、エラーは発生せず、結果が正しいように見えますが、何か見落としてしまったのは不思議です。

私はmissingフィルタについて、おそらくcustom valueを使用しています。これは必須ではないかもしれませんが、私はあまりよく分かりません。

最初のフィールドが見つからない場合、または必要でない場合、ソートする2番目のフィールドを定義する方法はありますか?ような何か:

"sort": [{"price_sold: {"order": "desc", "missing": "doc['field_name']"}]

は、単にこれら2種類が私に望ましい結果を与える追加しませんか?

ありがとうございました。

+0

質問しているクエリを試していないような感じです... –

+0

クエリ実行時に発生するエラーは何ですか? – CodeNotFound

+0

私はクエリを試しました。最初のソートセットではエラーは発生しません。もっと良い方法があるのか​​、何かを見落としているのであれば私は好奇心が強いです。 2番目のクエリは機能しませんが、そのフォーマットをサポートするためのドキュメントを見つけることができなかったために期待されています。 – Paul

答えて

2

私はあなたが何を求めているのか理解していると思います。 SQLの場合、ORDER BY COALESCE(price_sold、price_list)DESCとします。

リストされた最初の並べ替えは少し異なります。 ORDER BY price_sold DESC、price_list DESCと似ています。つまり、プライマリソートはprice_soldで、price_soldが等しいエントリではセカンダリソートはprice_listです。

「見つからない」がそのように働いた場合、2番目の並べ替えの試行は素晴らしいものになります。残念ながら、不足している「カスタム」オプションが表示され、定数値のみを指定できます。

fromとsizeを使用して検索を制限する必要がない場合は、sortの_scriptオプションを使用して、あなたに適したロジックを書くことができます。私はバッチを取得するためにfromとsizeを使用するので、私はここで終わりました。そして_scriptでソートすると、私が得ているアイテムは意味をなさない - アイテムは正しくソートされますが、アイテム。そこで、新しいアナライザを追加し、新しいアナライザを使用するようにフィールドを拡張しました。新しいフィールドを使用して並べ替えることができるようにしたい、または新しいフィールドが存在しない場合(以前にインデックスされたアイテムの場合)代わりに古いフィールドの値。しかし、それは可能ではないようです。私は、私の新しいフィールドに値が設定されるようにアイテムのインデックスを再作成しなければならないと思います。

2

誰かがまだ私はこのようなスクリプト作成しまっ探している場合:日付をソートするための

curl -XGET 'localhost:9200/_search?pretty&size=10&from=0' -H 'Content-Type: application/json' -d' 
{ 
    "sort" : { 
     "_script" : { 
      "type" : "number", 
      "script" : { 
       "lang": "painless", 
       "inline": "doc[\u0027price_sold\u0027] == null ? doc[\u0027price_list\u0027].value : doc[\u0027price_sold\u0027].value" 
      }, 
      "order" : "desc" 
     } 
    }, 
} 
' 

を、タイプはまだnumber残ることがあるが、hereが述べたように、あなたは.date.getMillisOfDay().valueを交換してください。

fromsizeは私のElasticSearch(5.1.1)でうまく機能しました。 アルゴリズムが正しく動作していることを確認するには、レスポンスで生成された値を確認してください(例:"sort" : [ 5.0622E7 ])。

+1

nullcheckロジックがここでは逆になっているようです。それは '' inline ''ではありません: '' doc [\ u0027price_sold \ u0027]!= null?doc [\ u0027price_sold \ u0027] .value:doc [\ u0027price_list \ u0027]。 –

+0

@MingSlogar良いキャッチ!それは今修正されました。 –

関連する問題