Elasticsearch - сортировка по вложенному полю в 2019 году - PullRequest
2 голосов
/ 11 июня 2019

Итак, я пытаюсь найти способ сортировки документов по одному свойству вложенных документов. Например, допустим, у меня есть индекс «видео». Каждое видео имеет список категорий, к которым оно относится. Каждая категория является вложенным документом, который содержит определенные метаданные о категории, например, ID, взгляды, слизняк. Вот пример сопоставления:

 "videos" : {
    "properties" : {
      "categories" : {
        "type" : "nested",
        "properties" : {
          "id" : {
            "type" : "integer"
          },
          "views" : {
            "type" : "integer"
          },
          "slug" : {
            "type" : "keyword"
          }
        }
      },
      "title" : {
        "type" : "text"
      },
    }
  }

А вот пример документа:

  {
    "_index" : "videos",
    "_id" : "123",
    "_source" : {
      "title" : "this is a test video",
      "categories" : [
        {
          "id" : 3533,
          "slug" : "animals",
          "views" : 314
        },
        {
          "id" : 3564,
          "slug" : "comedy",
          "views" : 814
        },
        {
          "id" : 4072,
          "slug" : "politics",
          "views" : 80
        }
      ],
    }
  }

Так что я бы хотел отсортировать видео по просмотрам в определенной категории. Например, сортируйте видео по просмотрам в категории «комедии» в порядке убывания. Я искал в Интернете решение этой проблемы, но большинство из них, кажется, очень специфично для одной проблемы или используют устаревшие запросы.

1 Ответ

1 голос
/ 11 июня 2019

Ypu нужно использовать вложенный фильтр. Вы можете получить дополнительную информацию https://qbox.io/blog/sorting-nested-fields-in-elasticsearch

GET videos/_search
{

  "sort": [
    {
      "categories.views": {
        "order": "asc",
        "nested": {
          "path": "categories",
          "filter": {
            "term": {
              "categories.slug": "comedy"
            }
          }
        }
      }
    }
  ]
}

Результат

   "hits" : [
      {
        "_index" : "videos",
        "_type" : "_doc",
        "_id" : "uT6bRGsBFW2mvGhmMxUU",
        "_score" : null,
        "_source" : {
          "title" : "this is a test video",
          "categories" : [
            {
              "id" : 3533,
              "slug" : "animals",
              "views" : 314
            },
            {
              "id" : 3564,
              "slug" : "comedy",
              "views" : 814
            },
            {
              "id" : 4072,
              "slug" : "politics",
              "views" : 80
            }
          ]
        },
        "sort" : [
          814
        ]
      },
      {
        "_index" : "videos",
        "_type" : "_doc",
        "_id" : "uj6bRGsBFW2mvGhmXxWl",
        "_score" : null,
        "_source" : {
          "title" : "this is a test video",
          "categories" : [
            {
              "id" : 3533,
              "slug" : "animals",
              "views" : 314
            },
            {
              "id" : 3564,
              "slug" : "comedy",
              "views" : 900
            },
            {
              "id" : 4072,
              "slug" : "politics",
              "views" : 80
            }
          ]
        },
        "sort" : [
          900
        ]
      }
    ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...