排序 - shuiyuebingdian/ElasticSearch GitHub Wiki
允许在特定字段上添加一种或多种排序。每种类型也可以颠倒。排序是在每个字段级别上定义的,也有特殊的字段名称:_score用于按分数排序和_doc是按索引顺序排序。
假设以下索引映射:
PUT /my_index
{
"mappings": {
"my_type": {
"properties": {
"post_date": { "type": "date" },
"user": {
"type": "keyword"
},
"name": {
"type": "keyword"
},
"age": { "type": "integer" }
}
}
}
}
GET /my_index/my_type/_search
{
"sort" : [
{ "post_date" : {"order" : "asc"}},
"user",
{ "name" : "desc" },
{ "age" : "desc" },
"_score"
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
_doc除了是最有效的排序顺序之外,没有实际用例。因此,如果您不关心文档的返回顺序,则应按排序_doc。这在scrolling特别有用。
排序值
每个文档的排序值也作为响应的一部分返回
排序
该order选项可以具有以下值:
asc | 升序排列 |
---|---|
desc | 降序排列 |
按_score排序时默认为desc,其他的默认为asc。 |
排序模式选项
Elasticsearch支持按数组或多值字段排序。 对于数组类型或多值的字段,使用mode选项控制选择哪个数组值对它所属的文档进行排序。该mode选项可以具有以下值:
min | 选择最低值 |
---|---|
max | 选择最高的值。 |
sum | 使用所有值的总和作为排序值。仅适用于基于数字的数组字段。 |
avg | 使用所有值的平均值作为排序值。仅适用于基于数字的数组字段。 |
median | 使用所有值的中位数作为排序值。仅适用于基于数字的数组字段。 |
排序模式示例用法
在下面的示例中,每个文档的价格字段具有多个价格。在这种情况下,结果命中将基于每个文档的平均价格按价格升序进行排序。
PUT /my_index/my_type/1?refresh
{
"product": "chocolate",
"price": [20, 4]
}
POST /_search
{
"query" : {
"term" : { "product" : "chocolate" }
},
"sort" : [
{"price" : {"order" : "asc", "mode" : "avg"}}
]
}
嵌套对象内部排序
Elasticsearch还支持内部有一个或多个嵌套对象的字段排序。“按嵌套字段排序”支持在已经存在的排序选项之上具有以下参数:
nested_path
定义要在哪个嵌套对象上排序。实际的排序字段必须是此嵌套对象内的直接字段。当按嵌套字段排序时,此字段是必填字段。
nested_filter
嵌套路径内的内部对象应与其匹配的过滤器,以便通过排序将其字段值考虑在内。常见的情况是在嵌套的过滤器或查询中重复查询/过滤器。默认情况下,no nested_filter为活动状态。
嵌套排序示例
在下面的示例中offer是nested类型的字段。需要指定nested_path; 否则,elasticsearch不知道需要捕获哪些嵌套级别的排序值。
POST /_search
{
"query" : {
"term" : { "product" : "chocolate" }
},
"sort" : [
{
"offer.price" : {
"mode" : "avg",
"order" : "asc",
"nested_path" : "offer",
"nested_filter" : {
"term" : { "offer.color" : "blue" }
}
}
}
]
}
按脚本排序和按地理位置距离排序时,也支持嵌套排序。
缺失值
如果文档中没有指定排序的字段,可以为这些文档设置一个值,_last,_first或自定义的值(将被用于缺少文档作为排序值)。默认值为_last。
例如:
GET /_search
{
"sort" : [
{ "price" : {"missing" : "_last"} }
],
"query" : {
"term" : { "product" : "chocolate" }
}
}
如果嵌套的内部对象与nested_filter不匹配,则使用缺失值。
忽略未映射的字段
默认情况下,如果没有与字段关联的映射,搜索请求将失败。该unmapped_type选项允许忽略没有映射的字段且不按其排序。此参数的值用于确定要发出的排序值。这是一个如何使用它的示例:
GET /_search
{
"sort" : [
{ "price" : {"unmapped_type" : "long"} }
],
"query" : {
"term" : { "product" : "chocolate" }
}
}
如果查询的任何索引都没有对应的映射,price 那么Elasticsearch会像处理type那样对它进行处理 long,该索引中的所有文档对此字段都没有值。
地理距离排序
。。。。。。