根据关键字分页搜索
使用from和size来进行分页
在执行查询时,可以指定from(从第几条数据开始查起)和size(每页返回多少条)数据,就可以轻松完成分页。
- from = (page – 1) * size
GET /job_idx/_search
{
"from": 0,
"size": 5,
"query": {
"multi_match": {
"query": "销售",
"fields": [
"title",
"jd"
]
}
}
}
使用scroll方式进行分页
使用from和size方式,查询在1W-5W条数据以内都是OK的,但如果数据比较多的时候,会出现性能问题。
Elasticsearch做了一个限制,不允许查询的是10000条以后的数据。如果要查询1W条以后的数据,需要使用Elasticsearch中提供的scroll游标来查询。
在进行大量分页时,每次分页都需要将要查询的数据进行重新排序,这样非常浪费性能。使用scroll是将要用的数据一次性排序好,然后分批取出。性能要比from + size好得多。
使用scroll查询后,排序后的数据会保持一定的时间,后续的分页查询都从该快照取数据即可。
第一次使用scroll分页查询
让排序的数据保持1分钟,所以设置scroll为1m
GET /job_idx/_search?scroll=1m
{
"query": {
"multi_match": {
"query": "销售",
"fields": [
"title",
"jd"
]
}
},
"size": 100
}
执行后,注意到在响应结果中有一项_scroll_id
,后续需要根据这个_scroll_id
来进行查询
第二次直接使用scroll id进行查询
有可能执行报错,修改第一次执行的分页查询,设置scroll为5m,"size": 1000后获取scroll id,然后在进行第二次分页查询
GET _search/scroll?scroll=1m
{
"scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFDRXT0IwSFVCa05lVVVxR1NOZGhqAAAAAAAADHoWSlhlMWozQUtUazZEendPS0lCc1d3Zw=="
}