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"
}
}
}
}
}
日期类型的 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"
}
}
}
}
}