一、排序功能
1. 默认排序
在 Elasticsearch 中,默认情况下,查询结果是根据 相关度 评分(score)进行排序的。我们之前已经了解过,相关度评分是通过 Elasticsearch 根据查询条件与文档内容的匹配程度自动计算得出的。如果不指定排序条件,Elasticsearch 会使用默认的相关度评分来排序查询结果。
2. 自定义排序
如果我们希望按照其他字段进行排序,而非使用默认的相关度排序(例如,按照价格、销量等字段),可以使用 sort 参数来指定排序字段。
排序字段的要求: 必须是数值类型、地理坐标或日期类型。
自定义排序的语法如下:
GET /indexName/_search
{"query": {"match_all": {}},"sort": [{"field": "asc" // "排序字段":"排序方式" (asc:升序、desc:降序)}]
}
field
:指定需要排序的字段名。asc
(升序)或desc
(降序)。
3. 多字段排序
当需要根据多个字段进行排序时,我们可以在 sort
参数中指定多个字段。排序会根据数组中指定的顺序逐级进行:
- 首先按第一个字段排序。
- 如果第一个字段的值相同,则按第二个字段排序,以此类推。
例如,若我们需要先按销量排序,销量相同的情况下再按价格升序排序:
查询语句如下:
GET /items/_search
{"query": {"match_all": {}},"sort": [{"sold": "desc" // 按销量降序排序},{"price": "asc" // 销量相同,按价格升序排序}]
}
4. 排序结果说明
- 排序后的查询结果不再根据相关度评分(
_score
)进行排序,因为我们已经指定了排序字段。 - 结果中的
score
字段将为null
,因为排序不再依赖于相关度评分。 - 查询结果将按照我们指定的排序字段进行排列。
二、分页功能
Elasticsearch 默认返回查询结果的前 10 条数据。如果我们希望查看更多数据,或者翻页查看查询结果,可以使用分页参数:from
和 size
。
- from:指定从第几条文档开始(类似于 SQL 中的
OFFSET
)。 - size:指定返回的文档数量(类似于 SQL 中的
LIMIT
)。
分页的语法如下:
GET /items/_search
{"query": {"match_all": {}},"from": 0, // 分页开始的位置,默认为0,从第 0 条开始"size": 10, // 期望获取的文档总数,返回 10 条结果
}
三、分页与排序结合
在实际业务中,我们常常需要将分页和排序结合使用。
假设我们需要查询销量排名前 10 的商品,并且在销量相同的情况下按照价格升序排序。
查询语句:
GET /items/_search
{"query": {"match_all": {}},"sort": [{"sold": "desc" // 按销量降序排序},{"price": "asc" // 销量相同,按价格升序排序}],"from": 0, // 从第 0 条开始"size": 10 // 返回 10 条结果
}
返回结果:
四、分页翻页
分页查询支持翻页功能。当我们查询第一页的结果时(from: 0, size: 10
),若需要查看第二页的数据,可以将 from
设置为 10(即跳过前 10 条数据),然后返回接下来的 10 条数据:
GET /items/_search
{"query": {"match_all": {}},"sort": [{"sold": "desc" // 按销量降序排序},{"price": "asc" // 销量相同,按价格升序排序}],"from": 10, // 跳过前 10 条数据,开始返回第 11 条"size": 10 // 返回 10 条结果
}
五、总结
- 排序:通过
sort
参数指定排序字段,支持单字段排序和多字段排序。 - 分页:通过
from
和size
参数控制返回数据的范围和条数。 - 排序与分页结合:可以同时使用排序和分页功能,实现复杂的查询需求。