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.keywordkeyword ,而不是映射中显示的 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