elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

Java ElasticSearch:脚本内联减去日期

Java ElasticSearch:脚本内联减去日期,java,elasticsearch,Java,elasticsearch,以下是我在elasticsearch中的一个文档: { "_index": "2017-10-21", "_type": "cat", "_id": "14", "_score": 2.2335923, "_source": { "name": "Biscuit", "breed": "Persian",

以下是我在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"
            }
}
例如,我想以分钟或天为单位计算“购买日期”和“出生日期”(减去它们)之间的时间,并在这个时间中添加一个新字段“购买时的年龄”(在每个品种为“波斯”的文档中,但这不是重点)。应该是这样的:

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]."
        }

谢谢你的帮助

我终于找到了解决办法

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"
              }
            }
          ]
        }
    }
}
SimpleDataFormat是一个用于以区域设置敏感方式格式化和解析日期的类。它允许格式化(日期->文本)、解析(文本->日期)和规范化

方法返回自1970年1月1日00:00:00 GMT以来经过的毫秒数


因此,通过执行
date\u 1.getTime()-date\u 2.getTime()
结果将是日期1和日期2之间的时间(以毫秒为单位)(假设日期1与当前日期的距离比日期2近。否则,结果可能相同但为负值)。

我终于找到了一个解决方案

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"
              }
            }
          ]
        }
    }
}
SimpleDataFormat是一个用于以区域设置敏感方式格式化和解析日期的类。它允许格式化(日期->文本)、解析(文本->日期)和规范化

方法返回自1970年1月1日00:00:00 GMT以来经过的毫秒数


因此,通过执行
date\u 1.getTime()-date\u 2.getTime()
结果将是日期1和日期2之间的时间(以毫秒为单位)(假设日期1与当前日期的距离比日期2近。否则,结果可能相同但为负)。

您好,我尝试了您的语法,但出现错误
“type”:“解析异常”、“原因”:“在[script]中启动对象的未知键”。“
我的代码是
GET json-2019.07.30//search{”script:{”inline:“ctx.\u source.ageOfRecord=(新的SimpleDateFormat(\'yyyyy-MM-dd'T'HH:MM:sszzz\”)。解析(ctx.\u-source@timestamp.getTime()-新的SimpleDateFormat(\'yyyyyy-MM-dd'T'HH:MM:MM:sszzz\”)。解析(ctx.\u source@timestamp.getTime())“},“query”:{“match\u all”:{}
您好,我尝试了您的语法,但出现了错误
“type”:“parsing\u exception”,“reason”:“START\u对象在[script]中的未知键”。
我的代码是
GET json-2019.07.30//search{“script”:{“inline”:“ctx.\u source ageOfRecord=(新的SimpleDateFormat(\'yyyy-MM-dd'T'HH:MM:sszzz\)。解析(ctx.\u源。@timestamp.getTime())-新的SimpleDateFormat(\'yyyy-MM-dd'T'HH:MM:sszzz\)。解析(ctx.\u源。@timestamp.getTime())“,”查询:{“全部匹配”:{}