2012-12-15 46 views
2

我正在使用Django,Haystack和ElasticSearch。我想對我的搜索結果進行排序,以便在排序的字段值爲空(「」)的結果之後出現非空的結果。我無法在Haystack中找到可以實現此目的的API。發送到ElasticSearch請求看起來像:查詢ElasticSearch最後訂購空字符串

{ 
    "sort":[ 
     { 
     "version":{ 
      "order":"asc" 
     } 
     } 
    ], 
    "query":{ 
     ... 
    } 
} 

有沒有辦法改寫這個ElasticSearch查詢,以便與「版本」空字符串結果會來這裏的「版本」的存在後的結果?

我已經用Python實現這個爲:

sorted(sqs, key=lambda x: getattr(x, 'version') == '') 

回答

2

該查詢分配_score的1.0與非空的版本和_score的2.0與空版本的所有記錄中的所有記錄。然後按升序排序,然後按升序排序。因此,所有具有空版本的記錄都會被推送到列表的底部。

{ 
    "query": { 
     "custom_filters_score" : { 
      "query" : { 
       "constant_score": { 
        "query": { 
         .... your original query ....       
        } 
       } 
      }, 
      "filters" : [ 
       { 
        "filter" : { "missing" : { "field" : "version"} }, 
        "boost" : "2" 
       } 
      ] 
     }   
    }, 
    "sort": [ 
     { 
      "_score": {"order":"asc"} 
     }, 
     { 
      "version": {"order":"asc"} 
     } 
    ] 
}