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
。如您所见,我调换了日期和年份。
我找到了一些关于远程查询和 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
。如您所见,我调换了日期和年份。