介紹Elasticsearch排序上下文
使用Painless腳本對查詢文檔進行排序,一般用於實現自定義的排序規則。
1. 語法說明
params (Map, read-only)
用戶定義參數,出入作爲查詢的一部分。
doc (Map, read-only)
包含當前文檔的字段。
對於單值字段通過doc[‘fieldname’].value方式訪問;對於多值字段則返回第一個值,其他值可以通過索引訪問:doc[‘fieldname’].get(index)
_score (double read-only)
當前文檔相關性評分。
Return(double)
特定文檔的評分。
2. 示例
2.1 根據字段長度排序
下面示例根據theatre
字段的長度進行排序:
GET /_search
{
"query" : {
"term" : { "sold" : "true" }
},
"sort" : {
"_script" : {
"type" : "number",
"script" : {
"lang": "painless",
"source": "doc['theatre'].value.length() * params.factor",
"params" : {
"factor" : 1.1
}
},
"order" : "asc"
}
}
}
2.2 根據特定字段確定順序
通常數據集中有些特定業務字段,如銷售類型。下面示例根據res_property
字段進行排序,但是根據其具體值確定順序。
GET /real-estate-sales/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": "int sortOrder = 0; if (doc['res_property'].value == 'B03') {sortOrder = 1} else if (doc['res_property'].value == 'B01') {sortOrder = 2} else if (doc['res_property'].value == 'B02') {sortOrder = 3} sortOrder; "
},
"order": "asc"
}
}
]
}
3. 總結
本文介紹了Elasticsearch的排序上下文,通過自定義腳本邏輯實現對查詢結果進行復雜業務排序。