搜索接口-排序(Search API-sort)
2015-10-20 16:02
585 查看
允许添加一个或多个排序到具体的某个字段。以及每个排序是可以逆转的。排序是定义在字段级别上的,通过_score字段,按得分排序。
如果JSON解析器不支持数组的话,排序请求也可以组装成如下:
对于每个文档返回的排序值也是作为返回响应数据的一部分。
从版本0.90.0.Beta1开始, Elasticsearch支持排序的数组字段就是被称为多值字段排序。模式选项控制那些数组的值被那来用于排序文档。模式选项可以具有以下值:
在下面这个例子中,每个文档(记录)的价格字段有多个价格。在这种情况下,命中的结果文档会按照平均价格的升序进行排序。
从版本0.90.0.Beta1以后, Elasticsearch还支持按照字段内一个或多个嵌套对象进行排序。按内嵌对象排序,在已有参数的基础上还支持以下参数:
在下面的例子中,offer是一个嵌套字段类型。因为offer是最接近继承的嵌套字段,通过nested_path参数选择的。只有内嵌对象颜色为蓝色的,将参加排序。
文档里的数字字段支持空值处理。缺少的值,可以_last,_First,或自定义值(即被用于缺少文档的排序值)。例如:
默认情况下,如果字段没有相关联的映射,搜索请求将失败。ignore_unmapped参数可以忽略该字段,如果这个字段没有映射,并不通过该字段排序。下面有个例子:
允许通过_geo_distance排序。下面是一个例子:
支持以下格式提供的坐标:
格式用
格式用
允许基于自定义脚本排序,这里是一个例子:
备注:如果使用单个定制脚本进行排序,推荐使用custom_score 查询代替基于比分的查询排序,这样更快。
当一个字段在排序的时候,分数没有计算好。通过将track_scores设置为true,分数仍旧将被计算和跟踪。
在排序的时候,有关排序的字段值被加载到内存中。这意味着,每个分片应该有足够的内存来包含这些内容。基于字符串类型的字段排序,不应该被分析/分词。对于数字类型,如果可能的话,建议明确设置字段类型(如短,整数,浮点数)。
转自 http://www.dongming8.cn/?p=471
{ "sort" : [ { "post_date" : {"order" : "asc"} }, "user", { "name" : "desc" }, { "age" : "desc" }, "_score" ], "query" : { "term" : { "user" : "kimchy" } } }
如果JSON解析器不支持数组的话,排序请求也可以组装成如下:
{ "sort" : { { "post_date" : {"order" : "asc"} }, "user" : { }, "_score" : { } }, "query" : { "term" : { "user" : "kimchy" } } }
排序值(Sort Values)
对于每个文档返回的排序值也是作为返回响应数据的一部分。
排序模式选项(Sort mode option)
从版本0.90.0.Beta1开始, Elasticsearch支持排序的数组字段就是被称为多值字段排序。模式选项控制那些数组的值被那来用于排序文档。模式选项可以具有以下值:min– 选择最低值。
max– 选择的最高值。
sum– 使用全部值的总和作为排序值。仅适用于基于数组的数值字段。
avg– 使用全部值的平均值作为排序值。仅适用于基于数组的数值字段。
排序模式的用法示例(Sort mode example usage)
在下面这个例子中,每个文档(记录)的价格字段有多个价格。在这种情况下,命中的结果文档会按照平均价格的升序进行排序。curl -XPOST 'localhost:9200/_search' -d '{ "query" : { ... }, "sort" : [ {"price" : {"order" : "asc", "mode" : "avg"}} ] }'
按内嵌对象排序(Sorting within nested objects)
从版本0.90.0.Beta1以后, Elasticsearch还支持按照字段内一个或多个嵌套对象进行排序。按内嵌对象排序,在已有参数的基础上还支持以下参数:nested_path- 定义以那个嵌套的对象进行排序。实际的排序字段必须是嵌套对象的直接字段。默认情况下是使用最直接的继承的嵌套对象的排序字段
nested_filter– 过滤器,过滤能匹配上的内嵌对象的需要拿来排序的字段。常见的情况是重复的查询/过滤器内的嵌套过滤器或查询。默认情况下,nested_filter是关闭的。
嵌套排序的例子(Nested sorting example)
在下面的例子中,offer是一个嵌套字段类型。因为offer是最接近继承的嵌套字段,通过nested_path参数选择的。只有内嵌对象颜色为蓝色的,将参加排序。curl -XPOST 'localhost:9200/_search' -d '{ "query" : { ... }, "sort" : [ { "offer.price" : { "mode" : "avg", "order" : "asc", "nested_filter" : { "term" : { "offer.color" : "blue" } } } } ] }'
缺失值(Missing Values)
文档里的数字字段支持空值处理。缺少的值,可以_last,_First,或自定义值(即被用于缺少文档的排序值)。例如:{ "sort" : [ { "price" : {"missing" : "_last"} }, ], "query" : { "term" : { "user" : "kimchy" } } }
忽略未映射的字段(Ignoring Unmapped Fields)
默认情况下,如果字段没有相关联的映射,搜索请求将失败。ignore_unmapped参数可以忽略该字段,如果这个字段没有映射,并不通过该字段排序。下面有个例子:{ "sort" : [ { "price" : {"ignore_unmapped" : true} }, ], "query" : { "term" : { "user" : "kimchy" } } }
地理距离排序(Geo Distance Sorting)
允许通过_geo_distance排序。下面是一个例子:{ "sort" : [ { "_geo_distance" : { "pin.location" : [-70, 40], "order" : "asc", "unit" : "km" } } ], "query" : { "term" : { "user" : "kimchy" } } }
支持以下格式提供的坐标:
纬经度作为属性(Lat Lon as Properties)
{ "sort" : [ { "_geo_distance" : { "pin.location" : { "lat" : 40, "lon", -70 } "order" : "asc", "unit" : "km" } } ], "query" : { "term" : { "user" : "kimchy" } } }
纬经度作为字符串(Lat Lon as String)
格式用lat,lon.
{ "sort" : [ { "_geo_distance" : { "pin.location" : "-70,40", "order" : "asc", "unit" : "km" } } ], "query" : { "term" : { "user" : "kimchy" } } }
地理坐标哈希值(Geohash)
{ "sort" : [ { "_geo_distance" : { "pin.location" : "drm3btev3e86", "order" : "asc", "unit" : "km" } } ], "query" : { "term" : { "user" : "kimchy" } } }
纬经度作为数组(Lat Lon as Array)
格式用[lon, lat], 注意, 纬经度的顺序必须和GeoJSON保持一致。
{ "sort" : [ { "_geo_distance" : { "pin.location" : [-70, 40], "order" : "asc", "unit" : "km" } } ], "query" : { "term" : { "user" : "kimchy" } } }
基于脚本的排序(Script Based Sorting)
允许基于自定义脚本排序,这里是一个例子:{ "query" : { .... }, "sort" : { "_script" : { "script" : "doc['field_name'].value * factor", "type" : "number", "params" : { "factor" : 1.1 }, "order" : "asc" } } }
备注:如果使用单个定制脚本进行排序,推荐使用custom_score 查询代替基于比分的查询排序,这样更快。
跟踪得分(Track Scores)
当一个字段在排序的时候,分数没有计算好。通过将track_scores设置为true,分数仍旧将被计算和跟踪。{ "track_scores": true, "sort" : [ { "post_date" : {"reverse" : true} }, { "name" : "desc" }, { "age" : "desc" } ], "query" : { "term" : { "user" : "kimchy" } } }
内存注意事项(Memory Considerations)
在排序的时候,有关排序的字段值被加载到内存中。这意味着,每个分片应该有足够的内存来包含这些内容。基于字符串类型的字段排序,不应该被分析/分词。对于数字类型,如果可能的话,建议明确设置字段类型(如短,整数,浮点数)。转自 http://www.dongming8.cn/?p=471
相关文章推荐
- 转载blog_Linux下Tomcat日志定期清理 及 logrotate 配置
- 百度地图导航与百度地图进行的坐标转换
- 无锡恒和科技物联网平台
- GreenDao 使用方法
- 基於jquery 拖拽
- openstack常用命令
- php缓存技术
- android环境变量的配置
- 解决java compiler level does not match the version of the installed java project facet
- 北航上机测试准备 程序2
- DAG 的最短路径算法
- 在OpenERP报表中使用selection 类型字段
- 新建网站与新建Asp.Net Web 应用程序的区别
- 企业源代码加密软件保护机制
- yaffs2文件系统移植出错:usage: ./patch-ker.sh c/l m/s kerneipath
- php设计模式-单例模式-工厂模式
- Summary Ranges
- 从源码角度理解android动画Interpolator类的使用
- android中通过代码实现文件权限修改(chmod)
- KVC/KVO