当前位置: 首页 > 面试题库 >

当我按降序搜索ID时,ElasticSearch返回的ID不为最大

华子昂
2023-03-14
问题内容

我有索引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

}

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

contracts/_doc/10005

返回正确的结果。

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


问题答案:

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

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



 类似资料:
  • 我们有一个需要跨多个索引查询的要求,如下所示 我们使用的是ElasticSearch 5.1.1. http://localhost:9200/index1,index2,index3/type1,type2/_search 查询: 但是,我们可能无法预先知道该索引是否存在,如果上述任何一个索引都不存在,我们将得到以下错误。 一个明显的方法是检查索引是否已经存在,但我希望避免额外的调用。 注意:至

  • 问题内容: 我正在使用并希望elasticsearch返回搜索的单词而不仅仅是点击。当我搜索单词并且模糊搜索找到单词时,我想知道是谁找到了它。 数据: 查询: 该查询将返回,但不知道是否找到它。 有人知道该怎么做或一个主意吗?我希望输出为。 问题答案: 您可以为此命名查询,方法是为每个查询命名。在结果中,每个匹配都将包含一个数组,其中包含匹配的查询的名称(例如及以下)。

  • 问题内容: 今天,我了解并决定将其使用和测试。我知道整数是不可变的,因此id应该是(?)相同。但是,当我在提示中进行测试时,我注意到了一些细微的差异,并想找出其背后的原因。 凉!到目前为止,所有签出。但是之后… 好的,所以测试一下,我注意到此行为一直持续到256年。id最多可以是8位数字,然后257将返回更大的id,可以是15位数字。因此类型必须是8个字节。 所以我发现它与8个字节长有关,但是任何

  • 关于搜索字段的两个问题: > 我想使用elastic4s dsl查找特定id是否存在。此查询elasticsearch API的aquivilent: 卷曲-XGET'http://localhost:9200/indexName/indexType/_search/exists?q=_id:foo' 但这会产生isExists无法检查的搜索定义 我想获取所有id,到目前为止,我得到了这个解决方案

  • 我配置了一个类似以下内容的语句(在这里进行解释,前面没有实际的代码): 就像现在一样,应用程序代码通过调用mybatis/postgres来生成本身以获取下一个序列值,然后将其传递给。 我想重构此代码,以便在中创建。据我所知,一种方法是将语句中的替换为。另一种方法是使用: 我希望在这两种情况下都能得到id的值作为返回值;是否生成了新记录和新序列id,或者如果存在冲突/更新,则为现有id。如何执行此

  • 我是MongoDB的新手,在这里有点疯狂。我正在使用最新的mongo java驱动程序版本和dropwizard。 我使用POJO向DDBB写入数据,这很有效。但是,在尝试获取元素时,我没有获得实际的\u id。以下是我尝试的内容: DDBB文档 人物类 返回值: 如您所见,它不会返回实际的id(例如603c249cbb33487d9baa49f8)。我尝试将id设置为字符串,但我得到的错误是解码