Skip to main content
 首页 » 编程设计

介绍Elasticsearch排序上下文

2022年07月19日150bhlsheji

介绍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
阅读延展