ES排序


普通排序

GET /my-index-000001(索引名)/_search
{
    "sort": [
        {
            "post_date": {
                "order": "asc"
            }
        },
        "user",
        {
            "name": "desc"
        },
        {
            "age": "desc"
        },
        "_score"
    ],
    "query": {
        "term": {
            "user": "kimchy"
        }
    }
}

當使用評分排序時,ES默認按照倒序desc排序,按照其他任意屬性排序時默認為正序asc排序


MODE

ES支持按照數組形式或者多種數值類型的屬性進行排序。其中mode屬性就是控制按照該多數值中具體哪一個屬性進行排序。

  • min:按照多個數值中的最小數值進行排序
  • max:按照多個數值中的最大數值進行排序
  • sum:將多個數值求和后進行排序(只適用於數字類型的數組)
  • avg:將多個數值求平均值后進行排序(只適用於數字類型的數組)
  • median:取多個數值的中位數進行排序(只適用於數字類型的數組)

按照升序排序時mode的默認值為min,按照降序排序時mode的默認值為max

mode的使用

在下面的例子中,屬性price在每個文檔中都有多個數值,這個查詢的結果會根據每個文檔中價格的平均值按正序asc排序

PUT /my-index-000001/_doc/1?refresh
{
   "product": "chocolate",
   "price": [20, 4]
}

POST /_search
{
    "query": {
        "term": {
            "product": "chocolate"
        }
    },
    "sort": [
        {
            "price": {
                "order": "asc",
                "mode": "avg"
            }
        }
    ]
}

numeric_type

數字類型的值可以通過numeric_type轉成另一種類型的值。numeric_type可接受以下類型的值 ["double", "long", "date", "date_nanos"] 並且可用於跨多個數據流或索引的搜索

numeric_type使用案例

創建兩個索引

PUT /index_double
{
  "mappings": {
    "properties": {
      "field": { "type": "double" }
    }
  }
}

PUT /index_long
{
  "mappings": {
    "properties": {
      "field": { "type": "long" }
    }
  }
}

兩個索引中field屬性一個時double類型,一個是long類型;默認情況下無法使用filed屬性同時對兩個索引進行排序。但是使用了numeric_type后便可以

POST /index_long,index_double/_search
{
   "sort" : [
      {
        "field" : {
            "numeric_type" : "double"
        }
      }
   ]
}

在上面這個例子中,index_long中的field從long轉換成double以與index-double索引生成的值兼容。同樣,也可以將float字段轉成long類型,但這種情況下數值會向下取整(負數則為向上取整)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM