在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 中搜索結果排序的效率與準確度。根據不同的業務需求,你可以靈活地調整這些優化方法,達到更好的搜索體驗。