【问题标题】:ElasticSearch return not maximum ID when i'm searching by descending id当我按降序搜索时,ElasticSearch 不会返回最大 ID
【发布时间】:2026-01-30 18:45:02
【问题描述】:

我有索引 URI

contracts/_doc/

我将我的文档推送到那里,ID 是由 SQL-DB 预先生成的

这是来自 JAVA 客户端的代码示例:

    final BulkRequest request = new BulkRequest();
    contracts.forEach(e -> request.add(new IndexRequest(CONTRACT_INDEX,
                                                        CONTRACT_INDEX_TYPE,
                                                        String.valueOf(e.getId()))
                                            .source("contractNumber", e.getContractNumber())
                                        )
    );

有时我需要查看索引中 ID 的最大值,然后我发送此查询

{
    "sort" : [
        { "_id" : {"order" : "desc"}}
    ],
    "size": 1
}

问题是 ElasticSearch 总是返回值不超过9999

        "hits": [
        {
            "_index": "contracts",
            "_type": "_doc",
            "_id": "9999",
            "_score": null,
            "_source": {
                "contractNumber": "2000/290/990990"
            },
            "sort": [
                "9999"
            ]
        }
    ]

当我使用查询执行搜索时:

{
"size": 10000

}

实际结果处于正确状态,我所有超过 9999 的 ID 都存在并由

选择
contracts/_doc/10005

返回正确的结果。

请告诉我如何解决这种情况

【问题讨论】:

  • 原因是您的 ID 是字符串,并且字符串按字典顺序排序,而不是按数字排序,因此在字符串世界中 9999 > 1000000。您应该做的是在文档中添加另一个数字字段,其中包含您的 ID 字段的数字等效项并按该数字字段排序
  • @Val 是的,你的建议很有效,谢谢。发表你的答案,我会批准它

标签: elasticsearch


【解决方案1】:

原因是您的 ID 是字符串,并且字符串按字典顺序排序,而不是按数字排序,因此在字符串世界中 9999 > 1000000。

您应该做的是在文档中添加另一个数字字段,其中包含与您的 ID 字段等效的数字,并按该数字字段排序。

【讨论】: