Запрос ElasticSearch для документов на основе активного элемента даты в массиве

У меня есть индекс ElasticSearch, где данные индексируются, как я скопировал и вставил внизу.

Идея состоит в том, что у него есть документы, а «официальное имя» документа находится в массиве. Это связано с тем, что официальное название документа действительно в течение определенного периода (т. е. между 2014 и 2015 годами имя было X, а между 2016 и 2018 годами — Y).

Мне нужен простой запрос, который находит документы на основе атрибута name, но там, где он действителен сегодня.

Карта документа:

"Company": {
        "properties": {
          "vatNumber": {
            "type": "string"
          },
          "names": {
            "type": "nested",
            "include_in_parent": true,
            "properties": {
              "name": {
                "type": "string"
              },
              "period": {
                "properties": {
                  "validFrom": {
                    "type": "date",
                    "format": "dateOptionalTime"
                  },
                  "validTo": {
                    "type": "date",
                    "format": "dateOptionalTime"
                  }
                }
              },
              "lastUpdated": {
                "type": "date",
                "format": "dateOptionalTime"
              }
            }
          }}}

Моя попытка:

Я использую NEST (клиент .NET). Я предполагаю, что есть 2 общих «проблемы»:

  1. Мне нужно указать свойство в массиве (name)
  2. Мне нужно проверить, что validTo действительно null (и игнорировать другие объекты в массиве)

Однако, после поиска, я совершенно потерялся в этих двух!


person Lars Holdgaard    schedule 11.03.2018    source источник
comment
То, что вы ищете, - это вложенные запросы, в которых вы можете указать путь к вложенному полю (здесь - имена.имя и имена.период.валидто). Чтобы проверить, является ли поле пустым, вы используете существующий запрос с предложением must_not логического запроса.   -  person sramalingam24    schedule 12.03.2018
comment
@sramalingam24 Отлично, это навело меня на правильный путь. Полностью еще не решил, но из-за других проблем. Можете дать ответ? Тогда отмечу как решенное :)   -  person Lars Holdgaard    schedule 12.03.2018
comment
хорошая сделка, должно быть прямо вперед отсюда   -  person sramalingam24    schedule 13.03.2018


Ответы (1)


То, что вы ищете, - это вложенные запросы, в которых вы можете указать путь к вложенному полю (здесь - имена.имя и имена.период.валидто). Чтобы проверить, является ли поле пустым, вы используете существующий запрос с предложением must_not логического запроса. Вот образец

ПОЛУЧИТЬ /_поиск

{
    "query": {
        "nested" : {
            "path" : "names",
            "query" : {
                "bool" : {
                    "must":{
                        "term": {
                            "names.name": "Lars"
                        }
                    },
                    "must_not" :{
                        "exists": {
                            "field": "names.period.validTo"
                        }
                    }
                }
            }
        }
    }
}
person sramalingam24    schedule 12.03.2018