在Elasticsearch 中,默認的排序方式是基於評分算法(即相關度)進行排序。然而,有時候我們需要根據特定的業務需求,比如價格、銷量等來排序搜索結果。為此,可以使用權重值(boost)來調整排序的優先級,權重值越高,結果排名越靠前。
假設我們有一個商品索引,其中包含字段`name`(名稱)和`price`(價格)。如果希望按照價格降序排序,可以使用以下代碼:
GET /products/_search { "query": { "match_all": {} }, "sort": [ { "price": { "order": "desc" } } ] }
這段代碼將會返回所有商品,並按價格降序排列結果。你可以根據實際需求修改排序字段。
有時我們需要根據多個條件進行排序,這時可以使用函數腳本來實現。假設我們要根據商品的評分和銷量來排序,其中評分的權重為0.7,銷量的權重為0.3。以下是實現這一目標的代碼:
首先,在創建索引時,我們需要添加評分(rating)和銷量(sales)字段:
PUT /products { "mappings": { "properties": { "name": { "type": "text" }, "rating": { "type": "float" }, "sales": { "type": "integer" } } } }
接下來,使用函數腳本來定義排序規則:
GET /products/_search { "query": { "match_all": {} }, "sort": [ { "_script": { "type": "number", "script": { "source": "(0.7 * doc['rating'].value) + (0.3 * doc['sales'].value)" }, "order": "desc" } } ] }
這段代碼將根據評分和銷量的加權平均值對搜索結果進行排序。你可以根據具體的需求調整權重值和計算方式。
Elasticsearch 提供了多種映射類型和設置,可以幫助我們優化搜索結果的排序。特別是,以下選項在排序中非常有用:
例如,我們要根據用戶的年齡進行排序。首先,創建索引時,我們需要設置字段映射:
PUT /users { "mappings": { "properties": { "name": { "type": "text" }, "age": { "type": "keyword", "index": "not_analyzed", "fielddata": true } } } }
接著,使用以下代碼根據年齡升序排序:
GET /users/_search { "query": { "match_all": {} }, "sort": [ { "age": { "order": "asc" } } ] }
這段代碼將會根據用戶的年齡進行升序排序。
通過使用權重值排序、定義復雜排序規則以及優化字段映射類型和設置,我們可以大大提高Elasticsearch 中搜索結果排序的效率與準確度。根據不同的業務需求,你可以靈活地調整這些優化方法,達到更好的搜索體驗。