elasticsearch 3种分页方式
编辑于 2022-02-22 14:10:07 阅读 1964
本文将提供原始restfull api
和elasticsearch-php
的示例
from + size
不适合深度分页,max_result_window
默认10k
size, from类似sql语句里的limit, 如limit {from} {size}
;
- size:每页条数
- from:从第几个行开始,默认0
curl
curl -H "Content-Type: application/json" -XGET 'localhost:9200/article/_search?pretty' -d'
{
"size": 2,
"from": 0
}'
php
public function search($from=0, $size=10) {
$params = [
'index' => 'article',
'body' => [
"sort"=>['_doc'],
'from'=>$from,
'size'=>$size,
]
];
return $this->cache()->search($params);
}
scroll
- using [from] is not allowed in a scroll context;
curl
#首页
curl -H "Content-Type: application/json" -XGET 'localhost:9200/article/_search?pretty&scroll=1m' -d'
{
"size": 2
}'
请求成功,结果里会有 _scroll_id 字段
#下一页
其中scroll_id的值是上一个请求中_scroll_id的值
注意:这次请求的接口和上一次的不一样
curl -H "Content-Type: application/json" -XGET 'localhost:9200/_search/scroll?pretty' -d'
{
"scroll":"1m",
"scroll_id":"FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFmNCWTM3c2U3Um5XYm1rS1FKU0xaVVEAAAAAAAAAYRZMX3BLM2FCOVFLaUhVbVk1STBnRTB3"
}'
php
public function search($scroll='1m', $size=10) {
$params = [
'index' => 'article',
"scroll" => $scroll,
'body' => [
"sort"=>['_doc'],
'size'=>$size,
]
];
return $this->cache()->search($params);
}
public function scroll($scroll_id, $scroll='1m') {
return $this->cache()->scroll(['scroll_id'=>$scroll_id, 'scroll'=>$scroll]);
}
search_after
使用search_after
- 必须要设置from=0
- 必须指定排序字段
- search_after的值是上一个请求最后一条记录中某些字段的值,具体参考排序字段
curl
#首页
curl -H "Content-Type: application/json" -XGET 'localhost:9200/article/_search?pretty' -d'
{
"size": 2,
"from": 0,
"sort": [
{
"_id": {
"order": "desc"
}
}
]
}'
请求成功,结果里会有 sort 字段
#下一页
其中search_after的值是上一个请求最后一条记录中sort的值
curl -H "Content-Type: application/json" -XGET 'localhost:9200/article/_search?pretty' -d'
{
"size": 2,
"from": 0,
"search_after": [7],
"sort": [
{
"_id": {
"order": "desc"
}
}
]
}'
php
public function search($search_after = [], $size = 10) {
$params = [
'index' => 'article',
'body' => [
"sort" => ['_doc'],
'from' => 0,
'size' => $size,
]
];
if (count($search_after) > 0) $params['body']['search_after'] = $search_after;
return $this->cache()->search($params);
}
参考
https://www.elastic.co/guide/cn/elasticsearch/php/current/index.html