Автоматическое индексирование секционированных коллекций CosmosDB в Azure Search

#azure-cosmosdb #azure-cognitive-search

#azure-cosmosdb #azure-когнитивный поиск

Вопрос:

Мы проводим некоторую работу по обеспечению автоматического индексирования из коллекции CosmosDB. Эта коллекция секционирована для того, чтобы иметь возможность неограниченного увеличения RUs.

Мы хотим создать один поисковый индекс Azure для каждого раздела CosmosDB, однако чтение канала ключей раздела из CosmosDB возвращает ключи раздела (например, ‘0’, ‘1’ и т.д.), А не фактическое значение, на основе которого разбита коллекция (в нашем случае языки ‘en-US’, ‘fr-FR’ и т.д.). Это означает, что при создании источника данных в Azure Search сложно программно создавать источники данных, индекс и индексаторы «на лету».

Мы используем запрос контейнера для фильтрации по некоторым документам (не все должны быть проиндексированы) для индексации, но есть ли способ указать ключ раздела CosmosDB или указать его в SQL-запросе другим способом, чем пытаться фильтровать по полю ключа раздела (в нашем случае ‘/Culture’)?

Ответ №1:

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

В любом случае, в Azure Search в настоящее время нет необходимости фильтровать логический или физический раздел, за исключением добавления фильтра ключа раздела в сам запрос. Тем не менее, вы должны иметь возможность программно создавать этот запрос для каждого источника данных / индексатора по своему усмотрению, используя следующий запрос для получения всех отдельных значений ключей раздела из вашей коллекции Cosmos DB, вместо использования канала «Диапазон ключей раздела»:

ВЫБЕРИТЕ язык, ОТЛИЧНЫЙ ОТ c.Culture

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

ВЫБЕРИТЕ * ИЗ c, ГДЕ c.Culture==значение ключа раздела