Отфильтруйте данные перед индексированием, чтобы максимально эффективно использовать пространство для хранения.
Индексирование - это то, что делает запросы к базе данных быстрыми и масштабируемыми. Без индекса база данных вынуждена просматривать каждую запись, чтобы вычислить ответ на запрос. Тщательно разработанный индекс позволяет ответить на запрос с помощью небольшой части работы, перейдя к соответствующей части.
Основы индексирования
Давайте рассмотрим пример данных о безопасности дорожного движения с портала открытых данных правительства Великобритании. Для каждого дорожно-транспортного происшествия существует запись, которая после денормализации и импортирования в базу данных Cloudant выглядит следующим образом:
В базе данных 1 176 672 записи, поэтому полет без индекса будет дорогостоящей операцией. Фактически, если вы попытаетесь выполнить запрос без предварительного создания индекса, Cloudant выполнит обязательство, но выдаст предупреждение в возвращаемых данных:
Поля, которые вам нужно проиндексировать, связаны с полями, которые вы используете в объекте selector в своем запросе. Если мы собираемся выполнять запросы между двумя датами, имеет смысл создать индекс в поле Дата:
Мы вызываем _index
конечную точку нашей базы данных Cloudant, передавая объект JSON, который описывает индекс, который мы хотим создать:
В этом случае нам нужно только проиндексировать поле Date
.
Получив этот запрос, Cloudant просматривает каждый документ в базе данных и создает индекс, в котором каждая запись упорядочена в Date
порядке. На большом наборе данных это может занять некоторое время - проверьте прогресс на вкладке Активные задачи на панели управления Cloudant или вызовите _active_tasks
endpoint.
После создания индекса мы можем запросить этот индекс, передав дату или диапазон дат, и Cloudant будет использовать индекс для выполнения запроса:
Построение индекса с частичным фильтром
Первый созданный нами индекс хранил запись для каждой из более чем миллиона записей. Это может быть именно то, что мы планировали, но в некоторых случаях нас может интересовать только подмножество данных.
Допустим, нас интересуют только несчастные случаи, произошедшие в выходные дни - нет смысла индексировать те, которые происходят в течение недели. Вот здесь и пригодятся определения индекса Cloudant с partial_filter_selector
.
Параметр partial_filter_selector
указывает индексатору фильтровать данные перед индексированием, что означает, что индекс больше не содержит данных для каждой записи в базе данных, а только тех, которые соответствуют предоставленному селектору.
Во время запроса вы можете дополнительно отсеять данные по полям, которые вы выбрали для индексации:
Наш запрос для происшествий 2015 года с использованием этого частичного индекса теперь содержит только несчастные случаи, произошедшие в выходные дни.
Для дополнительной читаемости кода вы также можете включить исходный частичный селектор в свой селектор времени запроса:
Cloudant будет использовать только частичный индекс для ответа на запрос, если вы укажете поля ddoc
или use_index
во время запроса. См. Документацию для полной информации.
Почему частичные индексы?
Частичные индексы предварительно фильтруют данные перед их записью в индекс. Это может сделать ваши индикаторы меньше, компактнее и быстрее для Cloudant. Кроме того, поскольку услуги Cloudant с оплатой по мере использования взимают плату за гигабайт данных (включая данные, используемые для хранения вашего основного JSON и данных индекса), меньшие индексы также могут помочь снизить ваши расходы!