elasticsearch 如何获取当前时间作为脚本使用的unix时间戳

6psbrbz9  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(2)|浏览(165)

我有三个字段:

  • 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
           }
         }
       }
     ]
   }
 }
}

但是有一个日期类型比较的问题,我不知道如何解决这个问题。谢谢你

p8ekf7hl

p8ekf7hl1#

谢谢乔的回答。我没有设法正确地实现它,但我认为这是一个脚本解决方案的好起点。
然而,我找到了另一种方法来做我想做的事情,使用range和bool/should的组合。
这就是:

{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "date_start": {
              "lte": "now"
            }
          }
        },
        {
          "bool": {
            "should": [
              {
                "range": {
                  "date_end": {
                    "gte": "now"
                  }
                }
              },
              {
                "term": {
                  "permanent": true
                }
              }
            ]
          }
        }
      ]
    }
  }
}
hxzsmxv2

hxzsmxv22#

Dynamic now在painless中被故意禁用。从文档中:
这主要有两个原因。首先,脚本通常在每个文档中运行一次,因此每次运行脚本时都会返回不同的now。第二,脚本通常以分布式方式运行,无法适当地同步now。相反,对于now,传入一个用户定义的参数,该参数带有字符串datetime或数字datetime。数字日期时间是首选,因为不需要解析它进行比较。
提示为什么你的脚本可能无法工作:
params.now应该是一个以历元秒为单位的整数,而不是字符串。另外,您需要使用.millis访问日期的时间戳值,然后转换为epoch秒。
举例:

{
  "query": {
    "bool": {
      "filter": [
        {
          "script": {
            "script": {
              "source": """
                def now = params.now;
                def start = doc['date_start'].value.millis/1000;
                def end = doc['date_end'].value.millis/1000;
                
                def is_permanent = doc['permanent'].value; 
                
                return (
                  (start <= now) && (end >= now)) ||
                  ((start <= now) && (is_permanent == params.permanent)
                )
              """,
              "lang": "painless",
              "params": {
                "now": 1594399256,
                "permanent": true
              }
            }
          }
        }
      ]
    }
  }
}

datetime数学很好地描述了here

相关问题