ElasticSearch: диапазон дат с полями внутри полей - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть проблема, для которой мне нужно написать запрос эластичного поиска, который даст мне то, что я ищу, прежде всего, вот один элемент моего JSON объекта в БД, который ищет запрос:

{
  "data": {
    "circuit": {
      "version": "2.12.2",
      "createdOn": "2020-02-04T10:38:11.282",
      "expirationDate": "2020-02-06T05:50:00.000",
      "expiredSoonNotification": false
    }
  },
  "createdDate": "2020-02-04T10:38:11.282"
}

Мне нужно получить все элементы, которые принимают это условие:

сейчас <"data.circuit.expirationDate" <("data.circuit.expirationDate" - "creationDate") / 10 + теперь </strong>

значение: мне нужно получить все предметы, у которых expirationDate теперь меньше 10%. Я надеюсь, что объяснил свою проблему, потому что не знаю, как использовать поля внутри lt ог GT

что-то, что я до сих пор делал, но не работает:

{
  "query": {
    "bool": {
      "must_not": [
        {
          "bool": {
            "must": [
              {
                "range": {
                  "data.circuit.expirationDate": {
                    "gt": "now",
                    "lt": ("data.circuit.expirationDate" - "createdDate")/10 + now
                  }
                }
              }
            ]
          }
        }
      ]
    }
  },
  "sort": [
    {
      "createdDate": {
        "order": "desc"
      }
    }
  ]
}

Спасибо

1 Ответ

0 голосов
/ 07 февраля 2020

Вы не можете выполнить математику, ссылаясь на другие поля в range -запросе. Вам нужно будет закодировать вашу логику c в script -запросе, используя "безболезненный" язык сценариев Elasticsearch. Script -запросы значительно медленнее, чем другие запросы, так как скрипт должен выполняться для каждого отдельного документа. Вы можете ограничить количество документов, для которых выполняется скрипт, разбив логи c на 2 части:

  1. "data.circuit.expirationDate" > now
  2. "data.circuit.expirationDate" < (("data.circuit.expirationDate" - "createdDate")/10 + now)

Ваша структура запроса должна выглядеть следующим образом (псевдокод):

"query": {
  "bool": {
    "must": { "script": "data.circuit.expirationDate" < ("data.circuit.expirationDate" - "createdDate")/10 + now) }
    "filter": { "range": "data.circuit.expirationDate" > now }
  }
}

Вам также следует подумать, действительно ли вам нужна точность вплоть до уровня в миллисекундах. С точки зрения производительности было бы намного лучше округлить now до более детальной единицы (например, сейчас / s для детализации второго уровня).

Предварительный расчет ("data.circuit.expirationDate" - "createdDate")/10 и сохранение вычисленного результата непосредственно в вашем Кроме того, документ значительно повысит производительность запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...