Получить элементы, чьи максимальные значения вложенного поля меньше значения параметра
У меня есть следующее отображение в 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