排序
es支持对搜索结果排序,默认是根据相关度算分(_score)来排序。可以排序的字段类型有:keyword、数值、地理坐标、日期等类型。
语法
GET /indexName/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"FIELD": {
"order": "desc" // 排序字段和排序方式,ASC、DESC
}
}
]
}
分页
es默认情况下只返回top10的数据,而如果要查询更多数据就需要修改分页参数了。
es通过修改from,size参数来控制要返回的分页结果:
GET /indexName/_search
{
"query": {
"match_all": {}
},
"from": 990, // 分页开始的位置,默认是0
"size": 10, // 期望获取的文档总数
"sort": [
{
"FIELD": {
"price": "asc"
}
}
]
}
es使用倒排索引,不利于分页,查询 990 ~ 1000的数据实际上是查询 0 ~ 1000 的数据,然后截取最后10条。单点查询没有问题。当搭建集群后数据处理变得复杂。
ES设定结果集查询的上限是10000
针对深度分页,ES提供了两种解决方案
- search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式
- scroll:原理将排序数据形成快照,保存在内存,官方已经不推荐使用
高亮
在搜索结果中把搜索关键字突出显示
做法是:服务端提前给搜索字段加上标签
GET /indexName/_search
{
"query": {
"FIELD": "text"
},
"highlight": { // 指定要高亮的字段
"fields": {
"FIELD":{
"pre_tags": "<em>", //开始标签
"post_tags": "</em>" //结束标签
}
}
}
}
# 高亮查询,默认情况下,ES搜索字段必须与高亮字段一致
GET /indexName/_search
{
"query": {
"match": {
"all": "如家"
},
"highlight":{
"fields": {
"name":{
"require_field_match": "false"
}
}
}
}
}
Reference
黑马程序员