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

У меня есть следующее отображение в asticsearch:

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

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам