Получить элементы, у которых максимальные значения вложенного поля меньше значения параметра

У меня есть следующее сопоставление в elasticsearch:

"mappings": {
  "company": {
    "properties": {
      "name": {
        "type": "keyword"
      },
      "employee": {
        "type": "object",
        "properties": {
          "age": {
            "type": "long"
          }
        }
      }
    }
  }
}

Я хотел бы знать, можно ли было получить все компании, максимальные значения возраста сотрудников которых меньше 30 лет. В SQL мне просто нужно выбрать компанию при присоединении к сотруднику и сгруппировать по идентификатору компании и сделать предложение where, чтобы максимальное значение возраст менее 30 лет.


person Quang Nguyen    schedule 25.06.2018    source источник
comment
Вы создаете один документ для каждого сотрудника в ES или один документ для компании с несколькими сотрудниками в поле сотрудника?   -  person Ryan Widmaier    schedule 25.06.2018
comment
У меня есть один документ на компанию с несколькими сотрудниками!   -  person Quang Nguyen    schedule 25.06.2018


Ответы (1)


В вашем случае это легко. Поскольку вы никогда не получите дубликат компании, потому что у вас есть только документ для каждой компании, вы можете просто выполнить прямой поиск. Пример:

GET yourindex/_search
{
  "query": {
    "bool": {
      "must_not": [
        {"range": {
          "employee.age": {
            "gt": 30
          }
        }}
      ]
    }
  }
}

Стоит отметить, что если вы когда-нибудь захотите выполнить поиск, объединяющий поля сотрудников, вы можете столкнуться с проблемами. Например, если вы хотите найти все компании, в которых есть сотрудник с age < 30 AND gender=MALE, эта модель не работает. По умолчанию ElasticSearch рассматривает все поля как независимые. Это означает, что этот запрос вернет любые компании, в которых есть хотя бы один сотрудник МУЖЧИНЫ и один сотрудник моложе 30 лет. У вас не было бы возможности сказать, что это должен быть один и тот же человек. Если вам нужно выполнять эти типы запросов, вам нужно будет посмотреть на вложенные сопоставления и запросы, которые немного изменят приведенный выше запрос.

Подробности: https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html

person Ryan Widmaier    schedule 25.06.2018
comment
Мне нужен был вложенный запрос, но ваша рекомендация мне очень помогла. Итак, я принял ответ! - person Quang Nguyen; 25.06.2018
comment
Если вам нужен вложенный запрос, не забывайте, что вам также нужно пометить поле как вложенное вместо объекта в сопоставлении, прежде чем индексировать какие-либо данные. - person Ryan Widmaier; 25.06.2018