ElasticSearch - разница между двумя полями даты

У меня есть индекс в ElasticSearch с двумя полями типа даты (metricsTime & comingTime). Пример документа приведен ниже. В Кибане я создал задержку поля в сценарии для разницы между этими двумя полями. Мой безболезненный сценарий:

doc['arrivalTime'].value - doc['metricsTime'].value

Однако при переходе на вкладку "Обнаружение" в Kibana я получил следующее сообщение об ошибке: class_cast_exception: Невозможно применить операцию [-] к типам [org.joda.time.MutableDateTime] и [org.joda.time.MutableDateTime]. Это выглядит так же, как ошибка, упомянутая в https://discuss.elastic.co/t/problem-in-difference-between-two-dates/121655. Но ответ на этой странице предполагает, что мой сценарий правильный. Не могли бы вы помочь?

Спасибо!

{
  "_index": "events",
  "_type": "_doc",
  "_id": "HLV274_1537682400000",
  "_version": 1,
  "_score": null,
  "_source": {
    "metricsTime": 1537682400000,
    "box": "HLV274",
    "arrivalTime": 1539930920347
  },
  "fields": {
    "metricsTime": [
      "2018-09-23T06:00:00.000Z"
    ],
    "arrivalTime": [
      "2018-10-19T06:35:20.347Z"
    ]
  },
  "sort": [
    1539930920347
  ]
}

1 ответ

Решение

Проверьте список выражений Lucene, чтобы проверить, какие выражения доступны для поля даты и как вы можете их использовать.

Просто для простоты, проверьте ниже query, Я создал два поля metricsTime а также arrivalTime в образце индекса, который я создал.

Образец документа

POST mydateindex/mydocs/1
{
  "metricsTime": "2018-09-23T06:00:00.000Z",
  "arrivalTime": "2018-10-19T06:35:20.347Z"
}

Запрос с использованием безболезненного сценария

POST mydateindex/_search
{ "query": {
    "bool": { 
      "must": {
        "match_all": {

        }
      },
        "filter": {
          "bool" : {
            "must" : {
                "script" : {
                    "script" : {
                        "inline" : "doc['arrivalTime'].date.dayOfYear - doc['metricsTime'].date.dayOfYear > params.difference",
                        "lang"   : "painless",
                        "params": {
                          "difference": 2
                        }
                    }
                }
            }
        }
        }

    }
  }
}

Обратите внимание на строку ниже в запросе

"inline" : "doc['arrivalTime'].date.dayOfYear - doc['metricsTime'].date.dayOfYear > params.difference"

Теперь, если вы измените значение difference от 2 в 26 (что на единицу больше, чем разница в датах), то вы видите, что выше query не вернул бы документ.

Но, тем не менее, я упомянул запрос в качестве примера того, как с помощью сценариев вы можете сравнить два разных запроса, и, пожалуйста, обратитесь к ссылке, которой я поделился.

Другие вопросы по тегам