elasticsearch - java - 如何使用java Hight level rest客户端在弹性搜索中执行范围查询?
问题描述
您好目前我有一个弹性搜索索引,我正在尝试使用 java 高级休息客户端库对该索引中的文档执行日期范围查询。但是它没有按预期工作。所以以下是我的索引。我必须对字段@timestamp 执行范围查询。
{
"took" : 6,
"timed_out" : false,
"_shards" : {
"total" : 2,
"successful" : 2,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 229081,
"max_score" : 1.0,
"hits" : [
{
"_index" : "mep-reports-2019.09.11",
"_type" : "doc",
"_id" : "68e8e03f-baf8-4bfc-a920-58e26edf835c-353899837500",
"_score" : 1.0,
"_source" : {
"account_id" : "270d13e6-2f4f-4d51-99d5-92ffba5f0cb6",
"inventory" : "SMS",
"flight_name" : "test flight 001",
"status" : "ENROUTE",
"msg_text" : "Test !!!!!!!!!!!!!!1 elastic search:is.gd/YfzotY",
"flight_id" : "68e8e03f-baf8-4bfc-a920-58e26edf835c",
"submission_ts" : "1568197286",
"recipient" : "353899837500",
"o_error" : null,
"nof_segments" : "-1",
"campaign_id" : "0fae8662-bee9-46ac-9b3e-062f4ba55966",
"campaign_name" : "Index search petri11",
"@version" : "1",
"sender" : "800111",
"delivery_ts" : "0",
"@timestamp" : "2019-09-11T10:21:26.000Z"
}
},
{
"_index" : "mep-reports-2019.09.11",
"_type" : "doc",
"_id" : "68e8e03f-baf8-4bfc-a920-58e26edf835c-353899837503",
"_score" : 1.0,
"_source" : {
"account_id" : "270d13e6-2f4f-4d51-99d5-92ffba5f0cb6",
"inventory" : "SMS",
"flight_name" : "test flight 001",
"status" : "ENROUTE",
"msg_text" : "Test !!!!!!!!!!!!!!1 elastic searchh",
"flight_id" : "68e8e03f-baf8-4bfc-a920-58e26edf835c",
"submission_ts" : "1568197286",
"recipient" : "353899837503",
"o_error" : null,
"nof_segments" : "-1",
"campaign_id" : "0fae8662-bee9-46ac-9b3e-062f4ba55966",
"campaign_name" : "Index search petri11",
"@version" : "1",
"sender" : "800111",
"delivery_ts" : "0",
"@timestamp" : "2019-09-11T10:21:26.000Z"
}
}
}
followign 是我的 java 代码,它尝试对 @timestamp 进行范围查询,但它不起作用。我只是从名为 SearchRequestBuilder 的构建器类中粘贴下面范围查询片段的一部分。
SearchRequestBuilder range(ZonedDateTime startDate, ZonedDateTime endDate) {
System.out.println(startDate); // 2019-08-31T23:00Z
System.out.println(endDate); // 2019-09-17T13:25:18.154Z
RangeQueryBuilder startRangeQueryBuilder = QueryBuilders.rangeQuery("@timestamp").gte(startDate);
startRangeQueryBuilder.format("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
boolQueryBuilder.should(startRangeQueryBuilder);
RangeQueryBuilder endRangeQueryBuilder = QueryBuilders.rangeQuery("@timestamp").lte(endDate);
boolQueryBuilder.should(endRangeQueryBuilder);
endRangeQueryBuilder.format("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
return this;
}
知道如何修复我的范围查询以使其正常工作
the followign is a SearchRequestBuilder that builds an elastic search index
static class SearchRequestBuilder {
private SearchRequest searchRequest;
private SearchSourceBuilder searchSourceBuilder;
private BoolQueryBuilder boolQueryBuilder;
SearchRequestBuilder(String elasticSearchIndex) {
this.searchRequest = new SearchRequest(elasticSearchIndex);
this.searchRequest.indicesOptions(IndicesOptions.lenientExpandOpen());
this.searchSourceBuilder = new SearchSourceBuilder();
this.searchRequest.source(searchSourceBuilder);
this.boolQueryBuilder = QueryBuilders.boolQuery();
this.searchSourceBuilder.query(this.boolQueryBuilder);
}
SearchRequestBuilder from(Integer pageNumber) {
this.searchSourceBuilder.from(pageNumber);
return this;
}
SearchRequestBuilder size(Integer pageSize) {
this.searchSourceBuilder.size(pageSize);
return this;
}
SearchRequestBuilder timeOut(long duration, TimeUnit timeUnit) {
this.searchSourceBuilder.timeout(new TimeValue(duration, TimeUnit.SECONDS));
return this;
}
SearchRequestBuilder range(ZonedDateTime startDate, ZonedDateTime endDate) {
System.out.println(startDate);
System.out.println(endDate);
// this.boolQueryBuilder.must(QueryBuilders.rangeQuery("@timestamp").from(startDate,true).to(endDate));
//QueryBuilders.rangeQuery("FieldName").from(startDate,true).to(endDate));
RangeQueryBuilder startRangeQueryBuilder = QueryBuilders.rangeQuery("@timestamp").gte(startDate);
startRangeQueryBuilder.format("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
boolQueryBuilder.should(startRangeQueryBuilder);
RangeQueryBuilder endRangeQueryBuilder = QueryBuilders.rangeQuery("@timestamp").lte(endDate);
boolQueryBuilder.should(endRangeQueryBuilder);
endRangeQueryBuilder.format("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
return this;
}
SearchRequestBuilder msisdn(String msisdn) {
if (msisdn != null) {
if (msisdn.indexOf("*") >= 0) {
WildcardQueryBuilder msisdnWildCardQueryBuilder = new WildcardQueryBuilder("recipient", msisdn);
boolQueryBuilder.must(msisdnWildCardQueryBuilder);
} else {
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("recipient", msisdn);
boolQueryBuilder.must(matchQueryBuilder);
}
}
return this;
}
SearchRequestBuilder accountId(UUID accountId) {
if (accountId != null) {
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("account_id", accountId.toString());
boolQueryBuilder.must(matchQueryBuilder);
}
return this;
}
SearchRequestBuilder campaignId(UUID campaignId) {
if (campaignId != null) {
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("campaign_id", campaignId.toString());
boolQueryBuilder.must(matchQueryBuilder);
}
return this;
}
SearchRequestBuilder flightId(UUID flightId) {
if (flightId != null) {
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("flight_id", flightId.toString());
boolQueryBuilder.must(matchQueryBuilder);
}
return this;
}
SearchRequestBuilder cdrStatus(String cdrStatus) {
if (cdrStatus != null) {
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("status", cdrStatus);
boolQueryBuilder.must(matchQueryBuilder);
}
return this;
}
SearchRequestBuilder inventoryCode(String inventoryCode) {
if (inventoryCode != null) {
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("inventory", inventoryCode);
boolQueryBuilder.must(matchQueryBuilder);
}
return this;
}
SearchRequestBuilder sort() {
searchSourceBuilder.sort(new FieldSortBuilder("@timestamp").order(SortOrder.DESC));
return this;
}
SearchRequest build() {
return this.searchRequest;
}
}
太感谢了
解决方案
主要问题是should()
没有考虑这些条款,因为其他条款是must()
(请参阅此处的原因)。如果您使用filter()
子句而不是must()
then 它将起作用。
该方法的示例flightId
如下:
SearchRequestBuilder flightId(UUID flightId) {
if (flightId != null) {
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("flight_id", flightId.toString());
boolQueryBuilder.filter(matchQueryBuilder);
} ^
return this; |
} |
change this
推荐阅读
- c - 可以释放在不同函数中分配的内存吗?
- python - 使用 urllib3.PoolManager().request() 调用 AWS lambda -> {'message': 'Forbidden'}
- spring - http-outgoing-2:关闭连接 ResourceAccessException:POST 请求上的 I/O 错误。HttpHostConnectException:连接被拒绝
- shell - 无法为 sendmail -t 添加新行到电子邮件正文 Unix |
- flutter - 无法从 Firebase 存储中获取下载网址
- algorithm - 在嘈杂的组中查找最大的匹配子串
- python - Pandas 要么没有找到特定的数据行,要么将其检测为空数据框
- mysql - 在 MySQL 中将整数转换为罗马数字
- javascript - 元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于简单函数中的索引类型
- javascript - 带有后代的 JavaScript 特殊字符选择器不起作用