簡體   English   中英

Elasticsearch java 范圍查詢日期格式不返回所有結果

[英]Elasticsearch range query date format for java not returning all the results

我有一個 elasticsearch 索引,其中包含格式為“ dd/MM/yyyy HH:mm:ss ”的時間戳字段和客戶名稱。 我需要刪除某個時間戳之前添加到索引中的記錄。 使用deletebyquery api 為 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 ”,它不再返回“ 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 (請參閱映射類型文檔):

"createdDate" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    }

您應該將字段類型更改為date

如果您使用動態映射,在索引期間,將檢查字符串字段createdDate以查看其內容是否與任何日期模式匹配,以便將其添加為新的date字段。 默認情況下似乎不支持您的格式。

要解決這個問題,您可以自定義 dynamic_date_formats以支持您自己的日期格式。

請注意, keyword字段的范圍查詢被認為是昂貴的,默認情況下不會執行,請參閱文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM