Можно ли отсортировать вложенные документы в ElasticSearch? - PullRequest
7 голосов
/ 02 марта 2012

Допустим, у меня есть следующее отображение:

"site": {
  "properties": {
    "title":       { "type": "string" },
    "description": { "type": "string" },
    "category":    { "type": "string" },
    "tags":        { "type": "array" },
    "point":       { "type": "geo_point" }
    "localities":  { 
      type: 'nested',
      properties: {
        "title":       { "type": "string" },
        "description": { "type": "string" },
        "point":       { "type": "geo_point" }
      }
    }
  }
}

Затем я выполняю сортировку "_geo_distance" на родительском документе и могу отсортировать документы на "site.point". Однако я также хотел бы, чтобы вложенные местоположения были отсортированы по «_geo_distance» внутри родительского документа.

Возможно ли это? Если да, то как?

1 Ответ

9 голосов
/ 03 марта 2012

К сожалению, нет (по крайней мере, пока).

Запрос в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...