排序 - 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,该索引中的所有文档对此字段都没有值。

地理距离排序

。。。。。。