java 的 Elasticsearch 范围查询日期格式未返回所有结果
Elasticsearch range query date format for java not returning all the results
我有一个 elasticsearch 索引,其中包含格式为“dd/MM/yyyy HH:mm:ss”的时间戳字段和客户名称。我需要删除某个时间戳之前添加到索引中的记录。使用 deletebyquery api for java 我有以下代码:
DeleteByQueryRequest request =
new DeleteByQueryRequest(index);
//request.setQuery(new TermQueryBuilder(customerKeywordField, customerName));
BoolQueryBuilder query = QueryBuilders.boolQuery()
.filter(QueryBuilders.termsQuery(customerKeywordField, customerName))
.filter(QueryBuilders.rangeQuery("createdDate.keyword").lte(timestamp));
request.setQuery(query);
try {
BulkByScrollResponse bulkResponse =
restHighLevelClient.deleteByQuery(request, RequestOptions.DEFAULT);
}
} catch (Exception e) {
//exception handling
}
这是按预期工作的,但是现在日期是“01/10/2021”,它不再 returns 记录“29/09/2021" 或类似结果作为结果的一部分,因此我假设它采用的日期格式为 "MM/dd/yyyy" 而不是
我尝试将格式设置为
QueryBuilders.rangeQuery("createdDate.keyword").lte(timestamp).format("*dd/MM/yyyy HH:mm:ss*")
但这也不起作用。我已经验证传递的时间戳格式正确,记录上的时间戳格式也正确,所以我不知所措。如果有人可以提供帮助,我将不胜感激。
编辑:映射
{
"Index_x" : {
"mappings" : {
"properties" : {
//other fields
"createdDate" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"customer" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
示例文档:
{
"_index": "Index_x",
"_type": "_doc",
"_id": "1632381612786",
"_score": 1,
"_source": {
"customer": "customer1",
"createdDate": "23/09/2021 12:49:44",
//other fields
},
"fields": {
"customer.keyword": [
"customer1"
"createdDate": [
"23/09/2021 12:49:44"
],
"createdDate.keyword": [
"23/09/2021 12:49:44"
]
"customer": [
"customer1"
]//other fields
}
}
字段 createdDate.keyword
是 keyword
,而不是映射中显示的 date
(请参阅映射类型 doc):
"createdDate" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
您应该将字段类型更改为 date
。
如果您是 using dynamic mapping,在索引期间,将检查字符串字段 createdDate
以查看其内容是否与任何日期模式匹配,以便将其添加为新的 date
场地。默认情况下似乎不支持您的格式。
要解决这个问题,您可以customize the dynamic_date_formats支持您自己的日期格式。
请注意,keyword
字段的范围查询被认为是昂贵的,默认情况下不会执行,请参阅 docs。
我有一个 elasticsearch 索引,其中包含格式为“dd/MM/yyyy HH:mm:ss”的时间戳字段和客户名称。我需要删除某个时间戳之前添加到索引中的记录。使用 deletebyquery api for java 我有以下代码:
DeleteByQueryRequest request =
new DeleteByQueryRequest(index);
//request.setQuery(new TermQueryBuilder(customerKeywordField, customerName));
BoolQueryBuilder query = QueryBuilders.boolQuery()
.filter(QueryBuilders.termsQuery(customerKeywordField, customerName))
.filter(QueryBuilders.rangeQuery("createdDate.keyword").lte(timestamp));
request.setQuery(query);
try {
BulkByScrollResponse bulkResponse =
restHighLevelClient.deleteByQuery(request, RequestOptions.DEFAULT);
}
} catch (Exception e) {
//exception handling
}
这是按预期工作的,但是现在日期是“01/10/2021”,它不再 returns 记录“29/09/2021" 或类似结果作为结果的一部分,因此我假设它采用的日期格式为 "MM/dd/yyyy" 而不是
我尝试将格式设置为
QueryBuilders.rangeQuery("createdDate.keyword").lte(timestamp).format("*dd/MM/yyyy HH:mm:ss*")
但这也不起作用。我已经验证传递的时间戳格式正确,记录上的时间戳格式也正确,所以我不知所措。如果有人可以提供帮助,我将不胜感激。
编辑:映射
{
"Index_x" : {
"mappings" : {
"properties" : {
//other fields
"createdDate" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"customer" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
示例文档:
{
"_index": "Index_x",
"_type": "_doc",
"_id": "1632381612786",
"_score": 1,
"_source": {
"customer": "customer1",
"createdDate": "23/09/2021 12:49:44",
//other fields
},
"fields": {
"customer.keyword": [
"customer1"
"createdDate": [
"23/09/2021 12:49:44"
],
"createdDate.keyword": [
"23/09/2021 12:49:44"
]
"customer": [
"customer1"
]//other fields
}
}
字段 createdDate.keyword
是 keyword
,而不是映射中显示的 date
(请参阅映射类型 doc):
"createdDate" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
您应该将字段类型更改为 date
。
如果您是 using dynamic mapping,在索引期间,将检查字符串字段 createdDate
以查看其内容是否与任何日期模式匹配,以便将其添加为新的 date
场地。默认情况下似乎不支持您的格式。
要解决这个问题,您可以customize the dynamic_date_formats支持您自己的日期格式。
请注意,keyword
字段的范围查询被认为是昂贵的,默认情况下不会执行,请参阅 docs。