搜索接口-排序(Search API-sort)

来源:互联网 发布:邪恶漫画知子伯母全集 编辑:程序博客网 时间:2024/06/05 03:56

允许添加一个或多个排序到具体的某个字段。以及每个排序是可以逆转的。排序是定义在字段级别上的,通过_score字段,按得分排序。

{    "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

0 0