BITMAP
Битовая карта - это эффективная техника индексирования, разработанная для повышения производительности запросов к скалярным полям с низкой кардинальностью. Под кардинальностью понимается количество отдельных значений в поле. Поля с меньшим количеством отдельных элементов считаются низкокардинальными.
Этот тип индекса помогает сократить время поиска скалярных запросов, представляя значения полей в компактном двоичном формате и выполняя над ними эффективные побитовые операции. По сравнению с другими типами индексов, растровые индексы обычно занимают больше места и обеспечивают более высокую скорость выполнения запросов при работе с полями с низкой кардинальностью.
Обзор
Термин Bitmap объединяет два слова: Бит и Карта. Бит представляет собой наименьшую единицу данных в компьютере, которая может содержать только значение 0 или 1. Карта, в данном контексте, означает процесс преобразования и организации данных в соответствии с тем, какое значение должно быть присвоено 0 и 1.
Растровый индекс состоит из двух основных компонентов: растровых изображений и ключей. Ключи представляют собой уникальные значения в индексируемом поле. Для каждого уникального значения существует соответствующее битовое изображение. Длина этих битовых карт равна количеству записей в коллекции. Каждый бит в битовой карте соответствует одной записи в коллекции. Если значение индексируемого поля в записи совпадает с ключом, то соответствующий бит устанавливается в 1, в противном случае - в 0.
Рассмотрим коллекцию документов с полями Category и Public. Мы хотим получить документы, которые относятся к категории Tech и открыты для публики. В этом случае ключами для наших растровых индексов будут Tech и Public.
Растровый индекс
Как показано на рисунке, растровые индексы для категорий Category и Public будут следующими:
Tech: [1, 0, 1, 0, 0], что показывает, что только 1-й и 3-й документы попадают в категорию Tech.
Public: [1, 0, 0, 1, 0], что показывает, что только 1-й и 4-й документы открыты для публики.
Чтобы найти документы, соответствующие обоим критериям, мы выполняем побитовую операцию AND на этих двух битовых картах:
- Tech AND Public: [1, 0, 0, 0, 0]
Полученное битовое изображение [1, 0, 0, 0, 0] указывает на то, что только первый документ(ID 1) удовлетворяет обоим критериям. Используя растровые индексы и эффективные побитовые операции, мы можем быстро сузить область поиска, избавившись от необходимости сканировать весь набор данных.
Создание растрового индекса
Чтобы создать растровый индекс в Milvus, используйте метод create_index() и установите параметр index_type в значение "BITMAP".
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
)
index_params = client.create_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters
index_params.add_index(
field_name="category", # Name of the scalar field to be indexed
index_type="BITMAP", # Type of index to be created
index_name="category_bitmap_index" # Name of the index to be created
)
client.create_index(
collection_name="my_collection", # Specify the collection name
index_params=index_params
)
В этом примере мы создаем растровый индекс по полю category коллекции my_collection. Метод add_index() используется для указания имени поля, типа индекса и имени индекса.
После создания растрового индекса можно использовать параметр filter в операциях запроса для выполнения скалярной фильтрации на основе проиндексированного поля. Это позволяет эффективно сузить результаты поиска с помощью растрового индекса. Дополнительные сведения см. в разделе Объяснение фильтрации.
Удаление индекса
Используйте метод drop_index(), чтобы удалить существующий индекс из коллекции.
В версии 2.6.3 и более ранних вы должны освободить коллекцию перед удалением скалярного индекса.
В v2.6.4 и более поздних версиях скалярные индексы можно удалять напрямую, как только в них отпадет необходимость - не нужно сначала освобождать коллекцию.
client.drop_index(
collection_name="my_collection", # Name of the collection
index_name="category_bitmap_index" # Name of the index to drop
)
Ограничения
Растровые индексы поддерживаются только для скалярных полей, которые не являются первичными ключами.
Тип данных поля должен быть одним из следующих:
BOOL,INT8,INT16,INT32,INT64,VARCHARARRAY(элементы должны быть одним из следующих:BOOL,INT8,INT16,INT32,INT64,VARCHAR)
Растровые индексы не поддерживают следующие типы данных:
FLOAT,DOUBLE: Типы с плавающей точкой не совместимы с двоичной природой растровых индексов.JSON: Типы данных JSON имеют сложную структуру, которая не может быть эффективно представлена с помощью растровых индексов.
Растровые индексы не подходят для полей с высокой кардинальностью (т. е. для полей с большим количеством различных значений).
Как правило, растровые индексы наиболее эффективны, когда кардинальность поля не превышает 500.
При увеличении кардинальности сверх этого порога преимущества растровых индексов в плане производительности снижаются, а накладные расходы на хранение становятся значительными.
Для полей с высокой кардинальностью следует рассмотреть возможность использования альтернативных методов индексирования, например инвертированных индексов, в зависимости от конкретного случая использования и требований к запросам.