介绍Elasticsearch排序上下文

介绍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的排序上下文,通过自定义脚本逻辑实现对查询结果进行复杂业务排序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章