Elasticsearch 无痛查询将日期字段值与用户输入的日期值进行比较

Elasticsearch painless Query to compare date field value with user input date value

日期类型的 ES 索引字段看起来像

"docdate":{ "type" : "date", "fields":{ "text":{ "type" : "text", "analyzer" : "autocomplete" } } }

查询应使用通过查询传递的用户输入参数值检查 docdate 值,如下所示。

                "script": {
                    "script": {
                        "source": "def effecDate=doc['docdate'].value; def sf = new SimpleDateFormat('yyyy-MM-dd'); (sf.parse(params.userdate).after(sf.parse(effecDate)) || (sf.parse(params.userdate) == sf.parse(effecDate)) ",
                        "lang": "painless",
                        "params": {
                            "userdate": "2020-12-01"
                        }
                    }
                }

低于铸造错误。

class_cast_exception: 无法将 org.elasticsearch.script.JodaCompatibleZonedDateTime 转换为 java.lang.String

如何实现这个查询。不应向字段添加任何数据类型

你可以这样做:

{
  "query": {
    "script": {
      "script": {
        "source": """
           def effecDate = doc['effdate'].value.toInstant(); 
           def pickupDate = Instant.parse(params.pickUpDate + 'T00:00:00Z');
           return ChronoUnit.DAYS.between(effecDate, pickupDate) >= 0;
        """,
        "lang": "painless",
        "params": {
          "pickUpDate": "2019-03-01"
        }
      }
    }
  }
}