Отфильтруйте данные перед индексированием, чтобы максимально эффективно использовать пространство для хранения.

Индексирование - это то, что делает запросы к базе данных быстрыми и масштабируемыми. Без индекса база данных вынуждена просматривать каждую запись, чтобы вычислить ответ на запрос. Тщательно разработанный индекс позволяет ответить на запрос с помощью небольшой части работы, перейдя к соответствующей части.

Основы индексирования

Давайте рассмотрим пример данных о безопасности дорожного движения с портала открытых данных правительства Великобритании. Для каждого дорожно-транспортного происшествия существует запись, которая после денормализации и импортирования в базу данных Cloudant выглядит следующим образом:

В базе данных 1 176 672 записи, поэтому полет без индекса будет дорогостоящей операцией. Фактически, если вы попытаетесь выполнить запрос без предварительного создания индекса, Cloudant выполнит обязательство, но выдаст предупреждение в возвращаемых данных:

Поля, которые вам нужно проиндексировать, связаны с полями, которые вы используете в объекте selector в своем запросе. Если мы собираемся выполнять запросы между двумя датами, имеет смысл создать индекс в поле Дата:

Мы вызываем _index конечную точку нашей базы данных Cloudant, передавая объект JSON, который описывает индекс, который мы хотим создать:

В этом случае нам нужно только проиндексировать поле Date.

Получив этот запрос, Cloudant просматривает каждый документ в базе данных и создает индекс, в котором каждая запись упорядочена в Date порядке. На большом наборе данных это может занять некоторое время - проверьте прогресс на вкладке Активные задачи на панели управления Cloudant или вызовите _active_tasksendpoint.

После создания индекса мы можем запросить этот индекс, передав дату или диапазон дат, и Cloudant будет использовать индекс для выполнения запроса:

Построение индекса с частичным фильтром

Первый созданный нами индекс хранил запись для каждой из более чем миллиона записей. Это может быть именно то, что мы планировали, но в некоторых случаях нас может интересовать только подмножество данных.

Допустим, нас интересуют только несчастные случаи, произошедшие в выходные дни - нет смысла индексировать те, которые происходят в течение недели. Вот здесь и пригодятся определения индекса Cloudant с partial_filter_selector.

Параметр partial_filter_selector указывает индексатору фильтровать данные перед индексированием, что означает, что индекс больше не содержит данных для каждой записи в базе данных, а только тех, которые соответствуют предоставленному селектору.

Во время запроса вы можете дополнительно отсеять данные по полям, которые вы выбрали для индексации:

Наш запрос для происшествий 2015 года с использованием этого частичного индекса теперь содержит только несчастные случаи, произошедшие в выходные дни.

Для дополнительной читаемости кода вы также можете включить исходный частичный селектор в свой селектор времени запроса:

Cloudant будет использовать только частичный индекс для ответа на запрос, если вы укажете поля ddoc или use_index во время запроса. См. Документацию для полной информации.

Почему частичные индексы?

Частичные индексы предварительно фильтруют данные перед их записью в индекс. Это может сделать ваши индикаторы меньше, компактнее и быстрее для Cloudant. Кроме того, поскольку услуги Cloudant с оплатой по мере использования взимают плату за гигабайт данных (включая данные, используемые для хранения вашего основного JSON и данных индекса), меньшие индексы также могут помочь снизить ваши расходы!