经过第一章的学习,我们已经能够利用DSL语法,从海量数据当中检索出你想要的那一部分。但是数据查询之后,往往还需要对这个搜索的结果去做一些处理,比如说排序,所以我们这一章就是来看这个ES当中的搜索结果处理的,主要包括排序、分页、高量。
我们先来看一下排序的处理。ES它其实默认也是有排序的。我们上一章已经说过,是按照相关度算分排序,分值越高,排名越高前。但是有的时候我们可能希望按照别的东西做排序,比如价格对吧?或者是按照这个日期更新一点的日期,去排序都有可能。
所以我们ES是允许你自己指定排序字段的。你一旦自己指定排序字段,ES就会放弃打分。那么这样查询的效率上面也会有一定的提升。它支持的排序字段的类型,比较常见的有keyword类型、数值类型、日期类型,还有地理坐标类型。
那么数值类型和日期类型,可能大家觉得会更多一点,比如说你价格就是一个数值类型的,日期、创建时间、更新时间,这不就是日期类型的吗?
Keyword的类型是字符串,它的排序其实是按照字母顺序排序,或者叫字典顺序排序,这种其实用的比较少,地理坐标也比较常见,比如说我想搜索到我这里最近的酒店,然后你就可以在地图上指定一个点。然后,我们的ES就可以去算一算周围的酒店,到你的距离是多少,然后做一个升序排序,这种地理坐标排序。因为它的数据类型不一样,所以它的语法上也有一定的差异。
其中Keyword、数值和日期这三种,他们的语法排序语法基本上是一样的,大概是这样子。
大家可以看到,首先是一个查询,然后这边来个query。这个query是我们上一章当中所讲的,上一章所讲的所有DSL是不是都写在query内部的:
这个query是我们上一章当中所讲的,上一章所讲的所有DSL是不是都写在query内部的,而我们这一章要讲的叫搜索结果处理,它跟query是同级的关系,不是写在query里边,大家别搞错。
那我们这里讲的是一个sort,所以这就是sort排序,它是一个数组。也就意味着将来你可以指定多个排序字段,这就像我们的mysql里面,mysql里的order by 是不是可以指定多个呀?比如说这里指定一个,将来你还可以继续去指定: 如果有多个要排序的情况下,先按照第一个字段排,第一个字段相等,再按第二个字段排,这一点跟mysql里面也是一样的。
具体排序的语法怎么来写,大家可以看到这里先指定一个字段名,你要根据哪个字段排,是价格还是日期呀,然后指定排序的方式是asc升序还是dsc降序,这是简单类型;
地理坐标类型它的语法就复杂,他这么写的叫geo_distance,然后分别去指定三个内容。第一是field,field就是字段:你要对哪个字段去做一个排序,比方说地理坐标location,后边指定你要排序的中心点经纬度坐标,然后order就是顺序,跟这边一样。
unit是单位,就是你排序完以后,那个结果是按照公里km展示,还是按照m展示都可以。这也是我们的两种常见的查询的一个语法。
下边我们从案例来演示一下。那第一个案例是对酒店数据按照用户评价降序排序,如果评价相同,我们再按照价格升序排序,那也就是说这里排序的字段其实是两个, 你在搜索的时候,我先按照用户评价给你排,评价越高,排名越靠前。但是如果评价相同的情况下,我再按照价格排。那也就是说将来我们写两个排序字段ok,一个是降序,一个升序: