默认情况下,搜索返回前10个匹配的命中率。要浏览更大的结果集,可以使用搜索API的from和size参数。from参数定义要跳过的点击数,默认为0。size参数是要返回的最大点击数。这两个参数一起定义了一页结果。
GET /_search
{
"from": 10,
"size": 20,
"query": {
"match": {
"user.id": "kimchy"
}
}
}
避免使用“from”和“size”一次翻页太深或请求太多结果。搜索请求通常跨越多个碎片。每个碎片都必须将其请求的命中和之前任何页面的命中加载到内存中。对于深度页面或大型结果集,这些操作会显著增加内存和CPU使用率,从而导致性能下降或节点故障。
默认情况下,我们不能使用“from”和“size”页面浏览超过10000次点击。此限制是由index.max_ result_window索引设置设置的保护措施。如果需要翻页浏览10000次以上的点击,请改用search_after参数。
注意:Elasticsearch使用Lucene的内部文档ID作为平局破坏者。这些内部文档ID可以在同一数据的多个副本之间完全不同。当分页搜索命中时,我们可能偶尔会看到具有相同排序值的文档排序不一致。
Search after
我们可以使用search_after参数使用上一页的一组排序值检索下一页的点击。
使用search_after需要具有相同查询和排序值的多个搜索请求。如果在这些请求之间发生刷新,则结果的顺序可能会更改,从而导致跨页面的结果不一致。为了防止出现这种情况,我们可以创建一个时间点(PIT),以便在搜索过程中保留当前索引状态。
POST /my-index-000001/_pit?keep_alive=1m
The API returns a PIT ID.
{
"id": "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA=="
}
要获取结果的第一页,请提交带有排序参数的搜索请求。如果使用PIT,请在PIT.ID参数中指定PIT ID,并从请求路径中省略目标数据流或索引。
GET /_search
{
"size": 10000,
"query": {
"match" : {
"user.id" : "elkbee"
}
},
"pit": {
"id": "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA==", (1)
"keep_alive": "1m"
},
"sort": [ (2)
{"@timestamp": {"order": "asc", "format": "strict_date_optional_time_nanos", "numeric_type" : "date_nanos" }}
]
}
(1):PIT ID for the search。
(2)&#x