我正在使用Elasticsearch查询ES数据。
当我在10000个元素之后查询页面时,我得到了这个异常:
RestStatusException{status=400} org.springframework.data.elasticsearch.RestStatusException:Elasticsearch异常[type=search_phase_execution_exception,reason=所有分片失败]; ElasticsearchStatusException[Elasticsearch exception [type=search_phase_execution_exception,reason=all shards failed]]; nested:ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception,reason=结果窗口太大,from + size必须小于或等于:[10000]但[12050]。请参阅scroll API以获得更有效的方法来请求大型数据集。此限制可以通过更改[index.max_result_window]索引级别设置来设置。]]; nested:ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception,reason=结果窗口太大,from + size必须小于或等于:[10000]但[12550]。请参阅scroll API以获得更有效的方法来请求大型数据集。此限制可以通过更改[index.max_result_window]索引级别设置来设置。]];\n\达特deployment.ROOT.war//org.springframework.data.elasticsearch.core.ElasticsearchExceptionTranslator. ExceptionIfPossible(ElasticsearchExceptionTranslator.java:69)\n\tat deployment.ROOT.wa
我发现了这个https://discuss.elastic.co/t/result-window-is-too-large/319979并提到了https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html#search-after
我以为我可以做类似的事情,但是...我的查询的排序部分是:
GET /cars/_search/
{
"from": 1001,
"size": 50,
"query" : {
"match_all" : {}
},
"sort": [
{
"_score": {
"order": "desc"
}
},
{
"_score": {
"order": "desc"
}
}
]
}
在响应中,我有一个排序块,它看起来像这样:
{
"took" : 11,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : [
{
"_index" : "cars",
"_type" : "_doc",
"_id" : "1239332",
"_score" : 1.0,
"_source" : {
...},
"sort" : [
1.0,
1.0
]
}
]
}
}
在他们的例子中,他们用数字显示search_after:
GET twitter/_search
{
"query": {
"match": {
"title": "elasticsearch"
}
},
"search_after": [1463538857, "654323"],
"sort": [
{"date": "asc"},
{"tie_breaker_id": "asc"}
]
}
我没有任何要排序的字段,评分是唯一有效的排序方式,那么我应该在查询的排序部分放什么呢?
在我的例子中,结果中的排序块中的1.0
似乎对我没有帮助。这不是唯一值,search_after它可能会失败,因为Elasticsearch如何从1.0分给予我正确的结果?如果所有人都是1.0分呢?
1条答案
按热度按时间sc4hvdpw1#
您可以简单地使用
tie_breaker_id
字段,它是启用文档值的_id
字段的副本。这就行了如果使用PIT (Point in time),则会自动添加另一个名为
_shard_doc
的平局打破者字段。需要说明的是,如果您希望在分页时“冻结”结果集,PIT非常有用,即:在分页过程中不受新文档的影响。注意:
tie_breaker_id
仅从8.4开始可用。在早期版本中使用_shard_doc