问题描述
如果我未指定任何“排序”字段,请告诉我分页是如何工作的?
在查询中,如果我未指定“ sort”字段,然后尝试使用“ from”加“ size”进行分页,elasticsearch如何返回数据?是否有可能返回重复的记录?
es查询:
GET index1,index2/_search?pretty
{
"from": 10,"size": 20,"_source": {"includes”:[“name”,“type”]},"query":{
"bool":{
"must":[
{
"term":{
"org_id":{
"value”:”1234456767257”,"boost":1.0
}
}
},{
"range" : {
“Timestamp” : {
"from" : 1596545417000,"to" : 1597035223465,"include_lower" : true,"include_upper" : true,"boost" : 1.0
}
}
}
],"adjust_pure_negative":true,"boost":1.0
}
}
}
在上面的查询中,我没有指定任何“排序”字段。如果每次调用后我增加“ from”,是否可以确保返回唯一结果?如果可以,怎么办?
解决方法
默认情况下,来自不同分片的排序结果是通过协调节点来完成的,该节点接受来自客户端的请求。
默认情况下,排序也是在_score字段上完成的。
是的,如果没有排序字段,考虑到群集是稳定的并且副本与主要分片对齐,结果始终是唯一的。
,默认情况下,文档按_score:desc
排序,如果您要不断索引新文档,那可能就不是您想要的。
我肯定会添加一个sort clause on _doc
,这是确保您将获得独特结果的唯一方法。
{
"from": 10,"size": 20,"sort": [
{
"_score": "desc" <--- add this
},{
"_doc": "asc" <--- and this
}
],...
}
此外,如果您考虑分页超出from: 10000
,则需要leverage search_after