• 关于 Milvus
  • 开始
  • 概念
  • 用户指南
  • 数据导入
  • 人工智能工具
  • 管理指南
  • 工具
  • 集成
  • 教程
  • 常见问题
  • API Reference

反转

当您需要对数据执行频繁的过滤查询时,INVERTED 索引可显著提高查询性能。Milvus 使用倒排索引来快速查找与过滤条件相匹配的准确记录,而不是扫描所有文档。

何时使用反转索引

需要时使用反转索引:

  • 通过特定值进行筛选:查找某个字段等于特定值的所有记录(例如category == "electronics")

  • 过滤文本内容:在VARCHAR 字段上执行高效搜索

  • 查询 JSON 字段值:对 JSON 结构中的特定键进行过滤

性能优势:INVERTED 索引无需进行全 Collectionions 扫描,可将大型数据集的查询时间从几秒缩短到几毫秒。

INVERTED 索引如何工作

Milvus 中的INVERTED 索引将每个唯一字段值(术语)映射到出现该值的文档 ID 集。这种结构可以快速查找具有重复或分类值的字段。

如图所示,该过程分为两个步骤:

  1. 前向映射(ID → 术语):每个文档 ID 都指向其包含的字段值。

  2. 反向映射(术语 → ID):Milvus Collections 收集唯一术语,并从每个术语到包含该术语的所有 ID 建立反向映射。

例如,值"electronics "映射到 ID13,而"books "映射到 ID25

How Inverted Index Works 反向索引如何工作

当你过滤特定值(例如category == "electronics" )时,Milvus 只需在索引中查找该术语,并直接检索匹配的 ID。这就避免了扫描整个数据集,并实现了快速过滤,尤其是对分类或重复值的过滤。

INVERTED 索引支持所有标量字段类型,如BOOLINT8INT16INT32INT64FLOATDOUBLEVARCHARJSONARRAY。不过,索引 JSON 字段的索引参数与普通标量字段略有不同。

在非 JSON 字段上创建索引

要在非 JSON 字段上创建索引,请按照以下步骤操作:

  1. 准备索引参数:

    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()
    
  2. 添加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
    )
    
  3. 创建索引:

    client.create_index(
        collection_name="my_collection", # Replace with your collection name
        index_params=index_params
    )
    

在 JSON 字段上创建索引Compatible with Milvus 2.5.11+

您还可以在 JSON 字段内的特定路径上创建 INVERTED 索引。这需要额外的参数来指定 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() 方法从 Collections 中删除现有索引。

  • v2.6.3或更早版本中,删除标量索引前必须释放 Collections。

  • v2.6.4或更高版本开始,一旦不再需要标量索引,就可以直接删除,无需先释放 Collections。

client.drop_index(
    collection_name="my_collection",   # Name of the collection
    index_name="category_index" # Name of the index to drop
)

最佳实践

  • 加载数据后创建索引:在已包含数据的 Collections 上建立索引,以提高性能

  • 使用描述性索引名称:选择能清楚表明字段和目的的名称

  • 监控索引性能:在创建索引前后检查查询性能

  • 考虑您的查询模式:在您经常过滤的字段上创建索引

下一步

想要更快、更简单、更好用的 Milvus SaaS服务 ?

Zilliz Cloud是基于Milvus的全托管向量数据库,拥有更高性能,更易扩展,以及卓越性价比

免费试用 Zilliz Cloud
反馈

此页对您是否有帮助?