2015-04-18 145 views
4

我想按name排序,但在結果末尾保留空值或缺少price數據。Elasticsearch:按空值排序字段最後

我曾嘗試:

sort: { 
    sorting.name: { 
     order: "asc" 
    }, 
    prices.minprice.price: { 
     missing: "_last" 
    } 
} 

但這只是各種各樣的名字。

+0

嘗試顛倒排序參數的順序。按照您指定的順序,按名稱排序,然後按名稱排序。嘗試爲:{ 「sort」:[ {「prices.minprice.price」:{「missing」:「_ last」}}, {「sorting.name」:{「order」:「asc」}] } –

回答

3

要做到這一點,我們可以使用自定義功能得分(which is faster than custom script based sorting according to elasticsearch documentation)。當缺少價格時,數字值將返回0.

然後,我們根據得分先分類成缺失價格數據的部分和不缺少價格數據的部分,然後根據名稱。

{ 
    "query": { 
     "function_score": { 
      "boost_mode": "replace", 
      "query": {"match_all": {}}, 
      "script_score": { 
       "script": "doc['price'].value == 0 ? 0 : 1" 
      } 
     } 
    }, 
    "sort": [ 
     "_score", 
     "name" 
    ] 
} 
+0

謝謝,但是,我的第一個標準必須是名稱。沒有價格數據應該在最後。例如,按價格排序。 – arnoldcoder

+0

看到我更新的答案 - 這個問題比我原先想象的複雜得多,我已經測試了上述內容,但它似乎工作。 – dpeacock

+0

感謝scritp評分,這工作。但是不能進入有小孩的領域。當我嘗試doc ['prices.2015-07-16.price']。value> 0? 1:0總是返回0. Data Like; 「價格」:{ 「2015年7月16日」:{ 「staticPrice」:415, 「價格」:290.5, 「conceptId」:4, 「currencyId」:1 } – arnoldcoder