介紹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的排序上下文,通過自定義腳本邏輯實現對查詢結果進行復雜業務排序。

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