Generi c способ получить предыдущие / следующие результаты поиска по идентификатору в Elasticsearch - PullRequest
5 голосов
/ 23 марта 2020

Скажем, у меня есть миллион (много) документов в моем индексе. Я выполняю поисковый запрос, сортируя элементы по некоторому ключу X.

Теперь у меня очень длинный список результатов: [..., id1, id2, id3, ...]

Вопрос: как мне получить id1 и * 1007? * если я знаю id2, но не хочу выполнять весь поиск / не хочу получать все идентификаторы?

Я ищу универсальное c решение, которое работает для любой поисковый запрос. Учитывая идентификатор, который существует в результатах запроса, как получить предыдущий / следующий по этому идентификатору.

Конечно, можно выполнить несколько поисковых запросов и достичь того же конечного результата, получив id2 и затем играть с порядком, чтобы получить идентификаторы 1 и 3.

1 Ответ

4 голосов
/ 03 апреля 2020

То, что вы хотите сделать, называется deep scrolling, у вас есть только два способа сделать это:

  1. scroll
  2. search_after

Самый простой способ - это search_after , но вам нужно будет сделать два запроса:

  • один запрос на id3
  • Еще один для id1

Итак, в этом примере я ищу id2 : 128. Я могу отсортировать документы с полем title, и я заранее получил значение title для id2, которое составляет title_of_128.

Чтобы выполнить search_after, я должен добавить _id к условию под сортировки

Вот мой запрос:

POST test/_search
{
  "size": 2,
  "search_after": ["title_of_128","128"],
  "sort": [
    {
      "title": {
        "order": "asc"
      },
      "_id": {
        "order": "asc"
      }
    }
  ]
}

Результат этого запрос id2 и id3

Теперь я инвертирую направление сортировки, чтобы получить id1:

POST test/_search
{
  "size": 2,
  "search_after": ["title_of_128","128"],
  "sort": [
    {
      "title": {
        "order": "desc"
      },
      "_id": {
        "order": "desc"
      }
    }
  ]
}

Результат этого запроса id2 и id1

Обратите внимание, что сортировка с _id устарела, и рекомендуется скопировать _id в другое поле, если вы хотите использовать search_after

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