我有三个字段:
- date_start(类型:日期)
- date_end(类型:日期)
- 永久(类型:bool)
我想返回所有文件与这些条件:
date_start <= now AND date_end >= now
OR
date_start <= now AND permanent == true
最好的办法是什么?
我想应该用这样的脚本:
{
"query": {
"bool": {
"filter": [
{
"script": {
"script": {
"source": "((doc['date_start'].value <= params.now) && (doc['date_end'].value >= params.now)) || ((doc['date_start'].value <= params.now) && (doc['permanent'].value == params.permanent))"
},
"lang": "painless",
"params": {
"now": "1594390526",
"permanent": true
}
}
}
]
}
}
}
但是有一个日期类型比较的问题,我不知道如何解决这个问题。谢谢你
2条答案
按热度按时间p8ekf7hl1#
谢谢乔的回答。我没有设法正确地实现它,但我认为这是一个脚本解决方案的好起点。
然而,我找到了另一种方法来做我想做的事情,使用range和bool/should的组合。
这就是:
hxzsmxv22#
Dynamic
now
在painless中被故意禁用。从文档中:这主要有两个原因。首先,脚本通常在每个文档中运行一次,因此每次运行脚本时都会返回不同的
now
。第二,脚本通常以分布式方式运行,无法适当地同步now
。相反,对于now
,传入一个用户定义的参数,该参数带有字符串datetime或数字datetime。数字日期时间是首选,因为不需要解析它进行比较。提示为什么你的脚本可能无法工作:
params.now
应该是一个以历元秒为单位的整数,而不是字符串。另外,您需要使用.millis
访问日期的时间戳值,然后转换为epoch秒。举例:
datetime数学很好地描述了here。