Elasticsearch как сортировать с вложенным состоянием - PullRequest
0 голосов
/ 13 июня 2019

У меня есть следующий контент ES, который в основном представляет собой список видео с вложенными идентификаторами видео для разных пользователей.

Мне нужно отсортировать список на основе даты updated_at для конкретного пользователя (дляНапример, 'B001').

{ "_index": "videos",
  "_source": {
    "id": 123456,
    "short_title": "First good title",
    "created_at": "2019-05-29T03:19:14",
    "user_list": [
      {
        "user": "A001",
        "video_id": "604214",
        "updated_at": "2019-05-29T03:26:48"
      },
      {
        "user": "B001",
        "video_id": "762001",
        "updated_at": "2019-05-29T06:27:56"
      },
      {
        "user": "C001",
        "video_id": "604218",
        "updated_at": "2019-05-29T06:27:57"
      }
    ]
  }
},
{ "_index": "videos",
  "_source": {
    "id": 127456,
    "short_title": "Second good title",
    "created_at": "2019-05-29T04:19:14",
    "user_list": [
      {
        "user": "B001",
        "video_id": "216001",
        "updated_at": "2019-05-29T06:26:58"
      },
      {
        "user": "A001",
        "video_id": "604218",
        "updated_at": "2019-05-29T06:25:38"
      },
      {
        "user": "C001",
        "video_id": "626001",
        "updated_at": "2019-05-29T06:25:42"
      }
    ]
  }
}

Я пробовал следующий запрос:

GET videos/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "user_list",
            "filter": {
              "match": {
                "user_list.user": "B001"
              }
            }
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 10,
  "sort": [
    {
      "user_list.updated_at": {
        "order": "asc",
        "nested_path": "user_list",
        "nested_filter": {
          "match": {
            "user_list.user": "B001"
          }
        }
      }
    }
  ]
}

Но я не могу получить правильный заказ.

Ожидаемый заказ:

{ "_index": "videos",
  "_source": {
    "id": 127456,
    "short_title": "Second good title",
    "created_at": "2019-05-29T04:19:14",
    "user_list": [
      {
        "user": "B001",
        "video_id": "216001",
        "updated_at": "2019-05-29T06:26:58"
      },
      {
        "user": "A001",
        "video_id": "604218",
        "updated_at": "2019-05-29T06:25:38"
      },
      {
        "user": "C001",
        "video_id": "626001",
        "updated_at": "2019-05-29T06:25:42"
      }
    ]
  }
},
{ "_index": "videos",
  "_source": {
    "id": 123456,
    "short_title": "First good title",
    "created_at": "2019-05-29T03:19:14",
    "user_list": [
      {
        "user": "A001",
        "video_id": "604214",
        "updated_at": "2019-05-29T03:26:48"
      },
      {
        "user": "B001",
        "video_id": "762001",
        "updated_at": "2019-05-29T06:27:56"
      },
      {
        "user": "C001",
        "video_id": "604218",
        "updated_at": "2019-05-29T06:27:57"
      }
    ]
  }
}

Здесь видео с идентификатором "127456" идет первым в порядке, поскольку необходимо, чтобы пользователь "updated_at" пользователя B001 находился в порядке возрастания.

Чего мне не хватает в запросе?

1 Ответ

0 голосов
/ 14 июня 2019

Отображение

PUT videos/_mapping
{

  "properties" : {
      "user_list" : {
        "type" : "nested",
        "properties" : {
          "user" : {
            "type" : "text"
          },
          "video_id" : {
            "type" : "text"
          },
          "updated_at" : {
            "type" : "date"
          }
        }
      },
      "id" : {
        "type" : "integer"
      },
      "short_title" : {
        "type" : "text"
      },
      "created_at" : {
        "type" : "date"
      }
    }
}

Запрос

GET videos/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "user_list",
            "query": {
              "bool": {
                "filter": {
                  "match": {
                    "user_list.user": "B001"
                  }
                }
              }
            }
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 10,
  "sort": [
    {
      "user_list.updated_at": {
        "order": "desc",
        "nested_path": "user_list",
        "nested_filter": {
          "match": {
            "user_list.user": "B001"
          }
        }
      }
    }
  ]
}

Результат

{
        "_index" : "videos",
        "_type" : "_doc",
        "_id" : "E3cuVGsBJ4bANhADI-an",
        "_score" : null,
        "_source" : {
          "id" : 123456,
          "short_title" : "First good title",
          "created_at" : "2019-05-29T03:19:14",
          "user_list" : [
            {
              "user" : "A001",
              "video_id" : "604214",
              "updated_at" : "2019-05-29T03:26:48"
            },
            {
              "user" : "B001",
              "video_id" : "762001",
              "updated_at" : "2019-05-29T06:27:56"
            },
            {
              "user" : "C001",
              "video_id" : "604218",
              "updated_at" : "2019-05-29T06:27:57"
            }
          ]
        },
        "sort" : [
          1559111276000
        ]
      },
      {
        "_index" : "videos",
        "_type" : "_doc",
        "_id" : "FHcuVGsBJ4bANhADjua8",
        "_score" : null,
        "_source" : {
          "id" : 127456,
          "short_title" : "Second good title",
          "created_at" : "2019-05-29T04:19:14",
          "user_list" : [
            {
              "user" : "B001",
              "video_id" : "216001",
              "updated_at" : "2019-05-29T06:26:58"
            },
            {
              "user" : "A001",
              "video_id" : "604218",
              "updated_at" : "2019-05-29T06:25:38"
            },
            {
              "user" : "C001",
              "video_id" : "626001",
              "updated_at" : "2019-05-29T06:25:42"
            }
          ]
        },
        "sort" : [
          1559111218000
        ]
      }

Я использую упругий поиск 7.0. Запрос такой же, как у вас, и я сортирую в порядке убывания 123456 идет первым как «пользователь»: «B001», «updated_at»: «2019-05-29T06: 27: 56» больше, чем "пользователь": "B001", "updated_at": "2019-05-29T06: 26: 58"

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