2017-03-18 14 views
0

私はプレミアム(スポンサー提供)のオファーをリストの一番上に置く必要があります。私はまた、新しい提供を少し増強するために減衰関数を使用する必要があります。Elasticsearchのプレミアムオファーを上げる方法

私はこのアイデアを思い付いた:

{ 
    "sort": [ 
     { 
     "_score": "desc" 
     } 
    ], 
    "from": 0, 
    "size": 15, 
    "query": { 
     "function_score": { 
     "query": { 

     }, 
     "functions": [ 
      { 
       "exp": { 
        "created_at": { 
        "scale": "14d", 
        "decay": 0.1 
        } 
       } 
      }, 
      { 
       "script_score": { 
        "script": { 
        "lang": "painless", 
        "inline": "doc['is_sponsored'].value ? 100 : 1" 
        } 
       } 
      } 
     ] 
     } 
    } 
} 

私は崩壊「EXP」機能を使用するので、時々新しい申し出があるため、関数の結果を乗算のプレミアム古いものの上に表示されています。

プレミアム古い提供:

スコアである0.0061177 * 100 = 0.6177

新しい正規のオファー:

スコアは150 * 1 = 150

あなたが見ることができるように、新しい定期的な提供しています古いプレミアムのものより高いスコアを持つことができます。

プレミアムオファーが常にリストの一番上にあることを確認する方法はありますか?

+0

あなたのマッピング/スキーマを見たいと提案する前に? – user3775217

答えて

0

オファーに優先度を追加できます。インデックス作成中はプレミアムオファーを優先し、次に新しいオファーが2番目に高いプライオリティを取得します。必要なのは優先順位で並べ替えることだけです。そして、あなたは関数のスコアを計算する必要はありませんし、スクリプトを書く必要はありません。

+0

まあ...私が '_score'でソートする必要があるのは、私がディケイ関数を使うことがわかるからです。フィルタリングの他にも、インデックス内で検索するので、 '_score'でソートするのは"必須 "です:) – Bald

関連する問題