2016-04-12 29 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" 
     } 
    } 
    ] 
相关问题