Elasticsearch найти запрос использования диапазона дат для пересечений и в пределах - PullRequest
0 голосов
/ 11 марта 2020

мой список в Elasticsearch

[{
  "index1": [{
    "hour_start": "2020-03-17 14:00:00",
    "hour_end": "2020-03-17 15:00:00"
  }]
}, {
  "index2": [{
    "hour_start": "2020-03-17 10:00:00",
    "hour_end": "2020-03-17 07:00:00"
  }, {
    "hour_start": "2020-03-18 10:00:00",
    "hour_end": "2020-03-18 07:00:00"
  }]
}, {
  "index3": [{
    "hour_start": "2020-03-17 13:00:00",
    "hour_end": "2020-03-17 10:00:00"
  }]
}, {
  "index4": [{
    "hour_start": "2020-03-17 09:00:00",
    "hour_end": "2020-03-17 04:00:00"
  }]
}]

как найти список получения в пределах и пересекается в диапазоне "2020-03-17 06:00:00" до "2020-03-17 12:00: 00 "?

Ожидаемый результат:

[{
  "index2": [{
    "hour_start": "2020-03-17 10:00:00",
    "hour_end": "2020-03-17 07:00:00"
  }, {
    "hour_start": "2020-03-18 10:00:00",
    "hour_end": "2020-03-18 07:00:00"
  }]
}, {
  "index3": [{
    "hour_start": "2020-03-17 13:00:00",
    "hour_end": "2020-03-17 10:00:00"
  }]
}, {
  "index4": [{
    "hour_start": "2020-03-17 09:00:00",
    "hour_end": "2020-03-17 04:00:00"
  }]
}]

Я устал искать пересечения в списке, я не знаю вasticsearch Логическое ИЛИ отличается от потока языка программирования

1 Ответ

0 голосов
/ 11 марта 2020

Тип поля должен быть изменен с типа объекта на вложенный тип . Это позволит рассматривать свойство в массиве как отдельный индекс

. Я использовал условие must [AND], чтобы охватить нижний регистр

       <-----row 1 interval------->

<--- find this -> <- -и это -> <- и это ->

Отображение:

{
  "mappings": {
    "properties": {
      "time": {
        "type": "nested", ---> note type
        "properties": {
          "hour_end": {
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss"
          },
          "hour_start": {
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss"
          }
        }
      }
    }
  }
}

Запрос:

{
  "query": {
    "nested": {
      "path": "time",
      "query": {
        "bool": {
          "must": [ 
            {
              "range": {
                "time.hour_start": {
                  "lte": "2020-03-17 10:00:00"
                }
              }
            },
            {
              "range": {
                "time.hour_end": {
                  "gte": "2020-03-17 04:00:00"
                }
              }
            }
          ]
        }
      },
      "inner_hits": {} --> to get objects in array which match
    }
  }
}
...