Elasticsearch 8.0+ Java 客户端 API 的范围查询

Ranged query with Java Client API for Elasticseach 8.0+

我找到了一些关于远程查询和 Elasticsearch 的主题,但这些主题使用了已弃用的 High Level REST Client 接口。我还在 elasticseach 页面上找到了一个讨论,该页面使用新界面,但版本 7.15.2。这里的问题是,查询是由 json 格式的字符串构建的,因为此版本不完全支持范围查询接口。

不幸的是,我在文档中找不到有用的东西,当涉及到新的 Java API Client 接口版本 8.0或以上。

我尝试了以下代码来获取多个索引中的消息 (my-index-*)。我将日期和时间格式设置为与数据库中使用的格式相对应。接下来,我用 from()to() 设置时间边界,并且存在给定时间段的数据。

// ...
var client   = new ElasticsearchClient(...);
var response = client.search(
    s -> s.index("my-index-*")
          .query(q -> q.range(
              r -> r.field("recordtime")
                    .format("yyyy/MM/dd HH:mm:ss")
                    .from("2020/01/01 00:00:00")
                    .to("2020/01/01 00:30:00"))),
    JsonNode.class);

当我执行上面的代码时,出现以下异常:

Exception in thread "main" co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/search] failed: [search_phase_execution_exception] all shards failed
    at co.elastic.clients.transport.rest_client.RestClientTransport.getHighLevelResponse(RestClientTransport.java:281)
    at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:147)
    at co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1526)
    at co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1543)
    at // the function including the line of code above.

这些是我的build.gradle对应elasticsearch的依赖

dependencies {
    // ...
    implementation group: 'co.elastic.clients',         name: 'elasticsearch-java', version: '8.1.0'
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind',   version: '2.13.0'
    // ...
}

所以,我做错了什么?我更喜欢使用构建器 API 而不是创建 json 字符串的方式,将其转换为 JsonData 对象并将其传递给 ElasticsearchClient 客户端。


我现在也尝试使用 curl 请求查询搜索并使用以下行:

curl -X GET -k -u elastic:$ESPASS "https://<es-server-url>:9200/my-index-*/_search"
  -H 'Content-Type: application/json' -d'{
  "query": {
    "range": {
      "recordtime": {
        "format": "yyyy/MM/dd HH:mm:ss",
        "from": "2020/01/29 00:00:00",
        "to": "2020/01/29 00:30:00"
      }
    }
  }
}'

这里我从服务器获取数据

好的,我发现错误了。

我搞砸了日期格式。更正后,我得到 Java API.

的结果

上述问题的代码按预期工作。但是在我的真实代码中,我使用了一个函数来获取时间字段的格式。好吧,函数返回的格式是 dd/MM/yyyy HH:mm:ss,但正确的格式是(如问题中所写)yyyy/MM/dd HH:mm:ss。如您所见,我调换了日期和年份。