Elasticsearch, как искать по времени в поле datetime - PullRequest
1 голос
/ 29 апреля 2020

У меня есть мнимый индекс test с отображением ниже

PUT test
{"mappings" : {
      "properties" : {
        "endTs" : {
          "type" : "date",
          "format": "yyyy-MM-dd HH:mm:ss",
          "index": true
        },
        "startTs" : {
          "type" : "date",
          "format": "yyyy-MM-dd HH:mm:ss",
          "index": true
        }
      }
    }
}

И добавьте некоторое значение, как показано ниже

POST _bulk
{ "index" : { "_index" : "test"} }
{ "startTs": "2020-01-01 00:00:00", "endTs": "2020-01-01 00:15:00" }
{ "index" : { "_index" : "test"} }
{ "startTs" : "2020-01-01 00:15:00", "endTs" : "2020-01-01 00:30:00" }
{ "index" : { "_index" : "test"} }
{ "startTs" : "2020-01-01 00:30:00", "endTs" : "2020-01-01 00:45:00" }
{ "index" : { "_index" : "test"} }
{ "startTs" : "2020-01-01 00:45:00", "endTs" : "2020-01-01 01:00:00" }
{ "index" : { "_index" : "test"} }
{ "startTs": "2020-01-01 01:00:00", "endTs": "2020-01-01 01:15:00" }
{ "index" : { "_index" : "test"} }
{ "startTs" : "2020-01-01 01:15:00", "endTs" : "2020-01-01 01:30:00" }
{ "index" : { "_index" : "test"} }
{ "startTs" : "2020-01-01 01:30:00", "endTs" : "2020-01-01 01:45:00" }
{ "index" : { "_index" : "test"} }
{ "startTs" : "2020-01-01 01:45:00", "endTs" : "2020-01-01 02:00:00" }

Моя цель - выполнить какой-либо запрос диапазона в этом startTs и endTs поле. как startTs: 2020-01-01 00:00:00' и endTs: 2020-01-01 00:45:00'. Мне нужно только фильтровать с time не полным datetime форматом. Поэтому я попробовал ниже фильтр

GET test/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "startTs": {
              "gte": "00:00:00",
              "format": "HH:mm:ss"
            }
          }
        },
        {
          "range": {
            "endTs": {
              "lte": "00:45:00",
              "format": "HH:mm:ss"
            }
          }
        }
      ]
    }
  }
}

Я ожидал, что он вернет все значения записи, меньшие, чем 2020-01-01 00:45:00

{ "startTs": "2020-01-01 00:00:00", "endTs": "2020-01-01 00:15:00" }
{ "startTs" : "2020-01-01 00:15:00", "endTs" : "2020-01-01 00:30:00" }
{ "startTs" : "2020-01-01 00:30:00", "endTs" : "2020-01-01 00:45:00" }

Но он ничего не дал вообще.

"hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }

Затем я попытался

GET test/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "script": {
            "script": {
              "source": "doc['startTs'].value.minute >= 0"
            }
          }
        },
        {
          "script": {
            "script": {
              "source": "doc['endTs'].value.minute <= 45"
            }
          }
        }
      ]
    }
  }
}

Он возвращает все значения, которые имеют минуты меньше, чем равные 45, и это также не ожидается.

Как выполнить запрос для данного индекса с временным диапазоном? любая помощь высоко ценится.

Я использую asticsearch 7,6

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

После долгих следов я нашел решение.

Это работает для меня. Хотя я не доволен этим.

GET test/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "script": {
            "script": {
              "source": "doc['startTs'].value.hour * 60 + doc['startTs'].value.minute >= 0"
            }
          }
        },
        {
          "script": {
            "script": {
              "source": "doc['endTs'].value.hour * 60 + doc['endTs'].value.minute <= 45"
            }
          }
        }
      ]
    }
  }
}

Все еще ищем лучшее решение.

0 голосов
/ 29 апреля 2020

Вместо индексации типа date я предлагаю индексировать integer числом минут или секунд (зависит от необходимого разрешения) с начала дня. Затем выполните запрос диапазона к этому полю.

Тип date не поддерживает тип запроса, который вы хотите сделать здесь.

...