2016-04-12 31 views
1

有時在我的結果集中,我有一些項目具有相同的_score,但沒關係,但是我想要在同一個_score中將「now」與start_date和end_date置於文件之間。在ElasticSearch中使用附加邏輯進行多列排序

基本上我要完成ElasticSearch這一點,但在等價物:

SELECT * FROM tbl WHERE ... ORDER BY _score DESC, (start_date <= NOW() AND NOW() <= end_date) DESC 

我怎麼能這樣做?

回答

2

如何在查詢分數計算本身內集成(start_date <= NOW() AND NOW() <= end_date)比較?

"query": { 
    "bool": { 
     "must": [ 
     // your query here 
     ], 
     "should": [ 
     { 
      "bool": { 
      "must": [ 
       { 
       "range": { 
        "start_date": { 
        "lte": "2015-03-03" 
        } 
       } 
       }, 
       { 
       "range": { 
        "end_date": { 
        "gte": "2015-03-03" 
        } 
       } 
       } 
      ] 
      } 
     } 
     ] 
    } 
    } 

或者,也有使用腳本的可能性:

"sort": [ 
    { 
     "_score": { 
     "order": "desc" 
     } 
    }, 
    { 
     "_script": { 
     "type": "number", 
     "script": "def now_date=new DateTime(new Date()); if (doc['start_date'].date <= now_date && doc['end_date'].date >= now_date) return 1; return 0", 
     "order": "desc" 
     } 
    } 
    ] 
相關問題