ES DSL搜索 - 深度分页与优化
2021-03-14 本文已影响0人
小P聊技术
1 介绍
主要介绍索引请求的基础API操作,使用postman进行请求,接口请求的前缀地址统一为elasticsearch 部署IP地址+端口号(例如 http://192.168.51.4:9200 。
统一请求地址:
POST /search_demo/_doc/_search
2 深度分页弊端
深度分页其实就是搜索的 深浅度,比如第1页,第2页,第20页,都是比较浅的搜索;而第10000页,第20000页都是很深了。
传递JSON数据
{
"query": {
"match_all": {}
},
"from": 9999,
"size": 10
}
请求结果有如下报错
Result window is too large, from + size must be less than or equal to: [10000] but was [10009].
在获取9999到10009条数据的时候,如果索引有三个分片的话,其实搜索是将从每个分片里面都获取10009条数据,然后集合在一起,总共是10009 * 3 = 30027条数据,针对30027条数据再次进行排序处理,最后得到最后的10条数据。
如此一来,搜索的越深入,就会造成性能问题,会耗费内存和占用CPU。es为了性能,它不支持超过一万条以上的分页查询。
3 优化深度分页
3.1 避免深度分页
避免深度分页操作可以通过限制分页页码,比如最多只能提供100页的展示,从101也开始就没了,针对一般用户搜索页码翻取不会太多的情况。
3.2 提升搜索量
设置 index.max_result_window
参数,自定义最大搜索数量
PUT /search_demo/_settings
{
"index.max_result_window": 20000
}
3.3 滚动搜索
scroll
滚动搜索(游标查询),滚动搜索可以先查询出一些数据,然后再紧接着依次往下查询。在第一次查询的时候会有一个滚动ID,相当于一个 锚标记
,随后再次滚动搜索会需要上次搜索的 锚标记
,根据这个进行下一次的搜索请求。
每次搜索都是基于一个历史的数据快照,查询数据的期间,如果有数据变更,搜索的内容并不会发生改变。
- scroll=1m,相当于是一个session会话时间,搜索保持的上下文时间为1分钟。
官方地址:
https://www.elastic.co/guide/cn/elasticsearch/guide/current/scroll.html
第一次请求
POST /search_demo/_search?scroll=1m
{
"query": {
"match_all": {}
},
"sort": ["_doc"],
"size": 1
}
{
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoAgAAAAAAAAAwFmt1RWVPY09BUm51RGZTMnF3VUE2bFEAAAAAAAAAMRZrdUVlT2NPQVJudURmUzJxd1VBNmxR",
"took": 1,
"timed_out": false,
"_shards": {
"total": 2,
"successful": 2,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 18,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "search_demo",
"_type": "_doc",
"_id": "1001",
"_score": null,
"_source": {
"id": 1001,
"age": 18,
"username": "Tic",
"nickname": "飞翔的荷兰号",
"money": 88.8,
"desc": "我在p2pi网站解决项目中遇到的问题,学习到了很多知识",
"sex": 0,
"birthday": "1992-12-24",
"face": "http://www.p2pi.cn/static/img/1001_face.png"
},
"sort": [
0
]
}
]
}
}
第二次请求
- scroll_id:第一次请求返回的 _scroll_id
POST /_search/scroll
{
"scroll_id": "DnF1ZXJ5VGhlbkZldGNoAgAAAAAAAAAwFmt1RWVPY09BUm51RGZTMnF3VUE2bFEAAAAAAAAAMRZrdUVlT2NPQVJudURmUzJxd1VBNmxR",
"scroll": "1m"
}
{
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoAgAAAAAAAAAwFmt1RWVPY09BUm51RGZTMnF3VUE2bFEAAAAAAAAAMRZrdUVlT2NPQVJudURmUzJxd1VBNmxR",
"took": 5,
"timed_out": false,
"terminated_early": true,
"_shards": {
"total": 2,
"successful": 2,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 18,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "test",
"_type": "_doc",
"_id": "2001",
"_score": null,
"_source": {
"id": "2001",
"nickname": "test-2001"
},
"sort": [
0
]
}
]
}
}
4 相关信息
- 博文不易,辛苦各位猿友点个关注和赞,感谢