elasticsearch Elastisearch有大量的数据和分页

vh0rcniy  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(88)

我正在使用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分呢?

sc4hvdpw

sc4hvdpw1#

您可以简单地使用tie_breaker_id字段,它是启用文档值的_id字段的副本。这就行了

"sort": [
    { "_score": "desc" },
    {"tie_breaker_id": "asc"}
]

如果使用PIT (Point in time),则会自动添加另一个名为_shard_doc的平局打破者字段。需要说明的是,如果您希望在分页时“冻结”结果集,PIT非常有用,即:在分页过程中不受新文档的影响。
注意:tie_breaker_id仅从8.4开始可用。在早期版本中使用_shard_doc

相关问题