介绍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的排序上下文,通过自定义脚本逻辑实现对查询结果进行复杂业务排序。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/105007129