1.es分页处理:
分页:
es默认情况下只返回top10的数据,而如果要查询更多数据,就需要修改分页参数了。
案例1:
GET /hotel/_search
{
"query": {
"match_all": {}
},
"from": 5, //分页开始的位置
"size": 20, //期望获取的文档总数
"sort": [
{
"price": {
"order": "asc"
}
}
]
}
深度分页问题:
es是分布式的,所以会面临深度分页问题。例如按price排序后,获取from=990,size=10的数据
- 1.首先在每个数据分片上都排序并查询前1000条文档。
- 2.然后将所有节点的结果聚合,在内存中重新排序选出前1000条文档
- 3.最后从这1000条中选取从990开始的10条文档
如果搜索页数过深,或者结果集(from+size)越大,对内存和CPU的消耗也越高。因此ES设定结果集查询的上限是10000.
深度分页解决方案:
针对深度分页,es提供了两种解决方案
1.search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。这是官方推荐的使用方式
2.scroll:原理是将排序数据形成快照,保存在内存。官方已经不推荐使用。
2.es高亮处理
高亮就是在搜索结果中把搜索关键字突出显示。
原理是这样的:将搜索结果中的关键字用标签标记出来,在页面中给标签添加css样式
案例1
GET /hotel/_search
{
"query": {
"match": {
"all": "如家"
}
},
"highlight": {
"fields": {
"name": {
"require_field_match": "false", //关键字和搜索内容可以不一致
"pre_tags": "<em>",
"post_tags": "</em>"
}
}
}
}