К сожалению, нет (по крайней мере, пока).
Запрос в ElasticSearch просто определяет, какие документы соответствуют запросу, и насколько хорошо они соответствуют.
Чтобы понять, для чего нужны вложенные документы, рассмотрим следующий пример:
{
"title": "My post",
"body": "Text in my body...",
"followers": [
{
"name": "Joe",
"status": "active"
},
{
"name": "Mary",
"status": "pending"
},
]
}
Указанный выше JSON, когда-то проиндексированный в ES, функционально эквивалентен следующему.Обратите внимание, что поле followers
было сглажено:
{
"title": "My post",
"body": "Text in my body...",
"followers.name": ["Joe","Mary"],
"followers.status": ["active","pending"]
}
Поиск: followers with status == active and name == Mary
будет соответствовать этому документу ... неправильно.
Вложенные поля позволяют нам обойти это ограничение.Если объявлено, что поле followers
имеет тип nested
вместо типа object
, то его содержимое создается как отдельный (невидимый) поддокумент внутри.Это означает, что мы можем использовать вложенный запрос или вложенный фильтр для запроса этих вложенных документов как отдельных документов.
Однако выходные данные из вложенных предложений запроса / фильтратолько говорит нам, если основной документ соответствует, и насколько хорошо он соответствует.Он даже не говорит нам, какой из вложенных документов соответствует.Чтобы понять это, нам нужно написать код в нашем приложении, чтобы проверить каждую из вложенных документов в соответствии с нашими критериями поиска.
Есть несколько открытых вопросов , требующих добавления этихфункций, но решить эту проблему не так просто.
Единственный способ добиться того, чего вы хотите, - это индексировать вложенные документы в виде отдельных документов, а также запрашивать и сортировать их независимо.Может быть полезно установить родительско-дочерние отношения между основным документом и этими отдельными вложенными документами.(см. отображение родительского типа , раздел Parent & Child index api docs и top-children и has-child запросы.
Кроме того, пользователь ES отправил по почте список о новом has_parent
фильтре , над которым он в настоящее время работает в fork . Однако этопока недоступно в основном репо ES.