ИНВЕРТИРОВАННЫЙ
Если вам необходимо часто выполнять запросы фильтрации данных, индексы INVERTED могут значительно повысить производительность запросов. Вместо сканирования всех документов Milvus использует инвертированные индексы, чтобы быстро находить записи, соответствующие условиям фильтра.
Когда использовать инвертированные индексы
Используйте инвертированные индексы, когда вам необходимо:
Отфильтровать по определенным значениям: Найти все записи, в которых поле равно определенному значению (например,
category == "electronics").Фильтровать текстовое содержимое: Выполнять эффективный поиск по полям
VARCHAR.Запрашивать значения полей JSON: Фильтр по определенным ключам в структурах JSON
Преимущество производительности: индексы INVERTED позволяют сократить время выполнения запросов с секунд до миллисекунд в больших наборах данных за счет отсутствия необходимости в полном сканировании коллекции.
Как работают индексы INVERTED
Индекс INVERTED в Milvus сопоставляет каждое уникальное значение поля (термин) с набором идентификаторов документов, в которых встречается это значение. Такая структура обеспечивает быстрый поиск полей с повторяющимися или категориальными значениями.
Как показано на схеме, процесс происходит в два этапа:
Прямое сопоставление (ID → Термин): Каждый идентификатор документа указывает на содержащееся в нем значение поля.
Инвертированное сопоставление (термин → идентификаторы): Milvus собирает уникальные термины и строит обратное отображение от каждого термина ко всем идентификаторам, которые его содержат.
Например, значение "электроника" соотносится с идентификаторами 1 и 3, а "книги" - с идентификаторами 2 и 5.
Принцип работы инвертированного индекса
Когда вы фильтруете определенное значение (например, category == "electronics"), Milvus просто ищет термин в индексе и получает соответствующие идентификаторы напрямую. Это позволяет избежать сканирования всего набора данных и обеспечивает быструю фильтрацию, особенно для категориальных или повторяющихся значений.
Индексы INVERTED поддерживают все скалярные типы полей, такие как BOOL, INT8, INT16, INT32, INT64, FLOAT, DOUBLE, VARCHAR, JSON и ARRAY. Однако параметры индекса для индексирования поля JSON несколько отличаются от обычных скалярных полей.
Создание индексов для неJSON-полей
Чтобы создать индекс для неJSON-поля, выполните следующие действия:
Подготовьте параметры индекса:
from pymilvus import MilvusClient client = MilvusClient(uri="http://localhost:19530") # Replace with your server address # Create an empty index parameter object index_params = client.prepare_index_params()Добавьте индекс
INVERTED:index_params.add_index( field_name="category", # Name of the field to index index_type="INVERTED", # Specify INVERTED index type index_name="category_index" # Give your index a name )Создайте индекс:
client.create_index( collection_name="my_collection", # Replace with your collection name index_params=index_params )
Создать индексы для полей JSONCompatible with Milvus 2.5.11+
Вы также можете создавать индексы INVERTED по определенным путям внутри полей JSON. Для этого потребуются дополнительные параметры для указания пути и типа данных JSON:
# Build index params
index_params.add_index(
field_name="metadata", # JSON field name
index_type="INVERTED",
index_name="metadata_category_index",
params={
"json_path": "metadata[\"category\"]", # Path to the JSON key
"json_cast_type": "varchar" # Data type to cast to during indexing
}
)
# Create index
client.create_index(
collection_name="my_collection", # Replace with your collection name
index_params=index_params
)
Подробную информацию об индексировании полей JSON, включая поддерживаемые пути, типы данных и ограничения, см. в разделе Индексирование JSON.
Удаление индекса
Используйте метод drop_index(), чтобы удалить существующий индекс из коллекции.
В версии 2.6.3 и более ранних вы должны освободить коллекцию перед удалением скалярного индекса.
Начиная с версии 2.6.4 и выше, вы можете удалять скалярный индекс напрямую, как только в нем отпадет необходимость - не нужно сначала освобождать коллекцию.
client.drop_index(
collection_name="my_collection", # Name of the collection
index_name="category_index" # Name of the index to drop
)
Лучшие практики
Создавайте индексы после загрузки данных: Создавайте индексы в коллекциях, которые уже содержат данные, для повышения производительности.
Используйте описательные имена индексов: Выбирайте имена, которые четко указывают на поле и цель
Контролируйте производительность индексов: Проверьте производительность запросов до и после создания индексов.
Учитывайте шаблоны запросов: Создавайте индексы для полей, по которым вы часто фильтруете
Следующие шаги
Узнайте о других типах индексов
Смотрите раздел Индексирование JSON, чтобы узнать о расширенных сценариях индексирования JSON