Можно ли найти определенную позицию документов в отсортированном поисковом индексе Azure?

У нас есть несколько индексов поиска Azure, которые используют коллекцию Cosmos DB из 25 тыс. Документов в качестве источника, и каждый индекс имеет большое количество свойств документа, которые можно использовать для сортировки и фильтрации.

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

Можно ли запросить индекс поиска Azure с помощью сортировки и фильтрации и получить позицию / ранг определенного идентификатора документа из набора результатов? Нужно ли искать альтернативный вариант? Я полагаю, что может быть способ сделать это с помощью серверной части SQL, но, очевидно, это будет серьезной задачей для реализации.

Мне еще предстоит найти способ сделать это, кроме написания запроса для разбивки на страницы, пока я не найду требуемый документ, который будет относительно дорогим и, возможно, медленным в плане обработки на сервере.

1 ответ

Решение

В Поиске Azure отсутствует механизм фильтрации в наборе результатов другого запроса. Вам придется пролистывать результаты, ища идентификатор документа на стороне клиента. Если ваши запросы не очень избирательны и дают много страниц результатов, это может быть медленным, так как $skip фактически переоценивает все результаты вплоть до указанной страницы.

Вы можете использовать кэширование, чтобы сделать это быстрее. По крайней мере один клиент Azure Search использует Redis для кэширования результатов поиска. Если ваши запросы достаточно избирательны, вы можете даже кэшировать результаты в памяти, чтобы платить за пейджинг только один раз.

Пробую это сейчас. Я использую двухэтапный процесс:

  1. Создайте свой запрос, но установите $count=true а также $top=0. Результат запроса должен содержать поле с именем @ odata.count.
  2. Затем вы можете выбрать индекс, а затем использовать $top=1 а также $skip=<index>чтобы вернуть одну запись. Есть одно предостережение: $skip принимает только числа меньше 100000.
Другие вопросы по тегам