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
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
в операциях запроса для выполнения скалярной фильтрации на основе проиндексированного поля. Это позволяет эффективно сузить результаты поиска с помощью растрового индекса. Дополнительные сведения см. в разделе Фильтрация метаданных.
Ограничения
Растровые индексы поддерживаются только для скалярных полей, которые не являются первичными ключами.
Тип данных поля должен быть одним из следующих.
BOOL
,INT8
,INT16
,INT32
,INT64
,VARCHAR
.ARRAY
(элементы должны быть одного из следующих типов:BOOL
,INT8
,INT16
,INT32
,INT64
,VARCHAR
)
Растровые индексы не поддерживают следующие типы данных.
FLOAT
,DOUBLE
: Типы с плавающей точкой не совместимы с двоичной природой растровых индексов.JSON
: Типы данных JSON имеют сложную структуру, которая не может быть эффективно представлена с помощью растровых индексов.
Растровые индексы не подходят для полей с высокой кардинальностью (т. е. для полей с большим количеством различных значений).
Как правило, растровые индексы наиболее эффективны, когда кардинальность поля не превышает 500.
При увеличении кардинальности сверх этого порога преимущества растровых индексов в плане производительности снижаются, а накладные расходы на хранение становятся значительными.
Для полей с высокой кардинальностью следует рассмотреть возможность использования альтернативных методов индексирования, например инвертированных индексов, в зависимости от конкретного случая использования и требований к запросам.