ElasticSearch:脚本内联减去日期

时间:2017-11-22 10:44:32

标签: java elasticsearch

以下是我在elasticsearch中的一份文件:

{
            "_index": "2017-10-21",
            "_type": "cat",
            "_id": "14",
            "_score": 2.2335923,
            "_source": {
                "name": "Biscuit",
                "breed": "Persian",
                "age": "3",
                "purchase_date": "2017-11-11T10:16:18+0100",
                "birth_date": "2017-01-21T10:16:18+0100"
            }
}

我想计算“购买日期”和“购买日期”之间的时间。和' birth_date' (例如,在几分钟或几天内减去它们)并添加一个新字段' age_when_bought'这个时候(在每个文件中,品种是#34;波斯语",但这不是重点)。它应该是这样的:

POST /*/_update_by_query

{
    "script" : {
        "inline": "ctx._source.age_when_bought = ctx._source.purchase_date - ctx._source.birth_date"
    },
    "query": {
        "bool": {
          "must": [
            {
              "match": {
                "breed": "Persian"
              }
            }
          ]
        }
    }
}

不幸的是,它并没有以这种方式运作。我的回复有错误500:

"caused_by": {
            "type": "class_cast_exception",
            "reason": "Cannot apply [-] operation to types [java.lang.String] and [java.lang.String]."
        }

我已经尝试将这些字段转换为日期,但我可能不会使用好的函数来执行此操作:

'SimpleDateFormat.parse(ctx._source.purchase_date)'

这次我的回复仍有错误500:

"caused_by": {
            "type": "illegal_argument_exception",
            "reason": "Unknown call [parse] with [1] arguments on type [SimpleDateFormat]."
        }

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我终于找到了解决方案!

POST /*/_update_by_query

{
    "script" : {
        "inline": "ctx._source.age_when_bought = (new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:sszzz\").parse(ctx._source.purchase_date).getTime()
- new SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:sszzz\").parse(ctx._source.birth_date).getTime())
    },
    "query": {
        "bool": {
          "must": [
            {
              "match": {
                "breed": "Persian"
              }
            }
          ]
        }
    }
}

SimpleDateFormat是一个以区域设置敏感的方式格式化和解析日期的类。它允许格式化(日期 - >文本),解析(文本 - >日期)和规范化。

Date.getTime()方法返回自1970年1月1日00:00:00 GMT以来经过的毫秒数。

因此,通过执行date_1.getTime() - date_2.getTime(),结果将是date_1和date_2之间的时间(以毫秒为单位)(假设date_1比当前日期更接近date_2。否则,结果可能相同但是为负)