普通排序
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
类型,但这种情况下数值会向下取整(负数则为向上取整)