ElasticSearch提供了多种方式实现分页,本文将介绍三种常用的方法:from+size、search after、scroll api,并提供Python代码示例。
1.from+size
from和size是ElasticSearch分页的基本概念,from表示从第几条记录开始,size表示返回多少条记录。例如,我们要查询前100条数据,可以使用如下的ElasticSearch查询语句:
GET /my_index/_search
{
"from": 0,
"size": 100,
"query": {
"match_all": {}
}
}
这个查询语句中,from为0,size为100,表示从第0条记录开始,返回100条记录。如果我们要查询第101-200条数据,只需要将from改为100,size还是100即可。
下面是使用Python实现ElasticSearch分页的示例代码:
from elasticsearch import Elasticsearch
es = Elasticsearch()
query = {
"from": 0,
"size": 100,
"query": {
"match_all": {}
}
}
res = es.search(index="my_index", body=query)
hits = res["hits"]["hits"]
for hit in hits:
# 处理每一条记录
这段代码中,使用Elasticsearch库创建一个ElasticSearch客户端,然后定义查询语句query,调用search方法进行查询,最后获取查询结果中的hits字段,遍历每一条记录进行处理。
2.search after
from+size虽然是ElasticSearch最基本的分页方法,但是它的缺点也很明显:分页查询效率低下。因为每次查询需要跳过前面的记录,查询的效率会随着from的增加而降低。在查询大量数据时,使用search after方法可以解决这个问题。
search after方法的原理是:将上一页的最后一条记录的排序值作为下一页查询的search after参数,这样就可以直接跳过前面的记录,查询效率大大提高。例如,我们要查询第101-200条记录,可以先查询前100条记录,获取最后一条记录的排序值,然后使用search after参数查询第101-200条记录:
GET /my_index/_search
{
"size": 100,
"sort": [
{"timestamp": "asc"},
{"_id": "asc"}
]
}
GET /my_index/_search
{
"size": 100,
"sort": [
{"timestamp": "asc"},
{"_id": "asc"}
],
"search_after": [last_timestamp, last_id]
}
这个查询语句中,sort参数指定按照timestamp升序、_id升序排序,然后使用search after参数指定上一页最后一条记录的timestamp和_id。
下面是使用Python实现ElasticSearch search after方法的示例代码:
from elasticsearch import Elasticsearch
es = Elasticsearch()
query = {
"size": 100,
"sort": [
{"timestamp": "asc"},
{"_id": "asc"}
]
}
res = es.search(index="my_index", body=query)
hits = res["hits"]["hits"]
for hit in hits:
# 处理每一条记录
last_hit = hits[-1] # 获取最后一条记录
last_timestamp = last_hit["_source"]["timestamp"]
last_id = last_hit["_id"]
while len(hits) == 100:
query["search_after"] = [last_timestamp, last_id]
res = es.search(index="my_index", body=query)
hits = res["hits"]["hits"]
for hit in hits:
# 处理每一条记录
last_hit = hits[-1]
last_timestamp = last_hit["_source"]["timestamp"]
last_id = last_hit["_id"]
这段代码中,首先查询前100条记录,获取最后一条记录的timestamp和_id作为下一页查询的search after参数。然后在循环中使用这个search after参数进行查询,直到查询结果不足100条为止。在循环中处理每一条记录即可。
3.scroll api
scroll api是ElasticSearch提供的另一种分页方式,它与search after方法不同的是,search after方法是基于排序值的分页方式,而scroll api是基于游标的分页方式。使用scroll api需要先创建一个游标,然后使用游标进行分页查询。例如,我们要查询前1000条记录,可以使用如下的ElasticSearch查询语句:
POST /my_index/_search?scroll=1m
{
"size": 100,
"query": {
"match_all": {}
}
}
这个查询语句中,scroll参数指定游标的存活时间,每次查询返回的结果中会包含一个scroll_id,使用这个scroll_id进行下一次查询即可。
下面是使用Python实现ElasticSearch scroll api的示例代码:
from elasticsearch import Elasticsearch
es = Elasticsearch()
query = {
"size": 100,
"query": {
"match_all": {}
}
}
res = es.search(index="my_index", body=query, scroll="1m")
scroll_id = res["_scroll_id"]
hits = res["hits"]["hits"]
for hit in hits:
# 处理每一条记录
while len(hits) > 0:
res = es.scroll(scroll_id=scroll_id, scroll="1m")
scroll_id = res["_scroll_id"]
hits = res["hits"]["hits"]
for hit in hits:
# 处理每一条记录
这段代码中,首先查询前100条记录,获取scroll_id和查询结果中的hits字段。然后在循环中使用scroll_id进行查询,直到查询结果为空为止。在循环中处理每一条记录即可。
小结:
本文介绍了ElasticSearch分页的三种常用方法:from+size、search after、scroll api,并提供了Python代码示例。在使用分页查询时,应根据实际情况选择合适的方法,以提高查询效率。