向量索引是构建语义搜索、推荐系统和 RAG(检索增强生成)应用的基础,正确的配置对搜索性能和质量至关重要。本文将基于如下示例详细介绍如何在 ES 中创建向量索引,深入解析每个配置参数的含义和作用。
索引 Mapping 详解
如下是一个向量索引的创建示例:
PUT /book-index{"settings": {"index": {"number_of_shards": 3,"number_of_replicas": 1,"refresh_interval": "1s"}},"mappings": {"properties": {"id": {"type": "keyword"},"category": {"type": "keyword"},"price": {"type": "integer"},"title_text": {"type": "text"},"title_vector": {"type": "dense_vector", // 稠密向量"dims": 768, // 向量维度"similarity": "cosine", // 向量相似度算法"index_options":{"type": "hnsw","m": 16, // HNSW 图中每个节点的最大连接数"ef_construction": 100 // 构建HNSW时,为每个新节点考察的候选邻居数量,影响构建索引的质量和速度}},"content_text": {"type": "text"},"content_vector": {"type": "dense_vector","dims": 768,"similarity": "cosine","index_options":{"type": "hnsw","m": 16, // HNSW 图中每个节点的最大连接数"ef_construction": 100 // 构建HNSW时,为每个新节点考察的候选邻居数量,影响构建索引的质量和速度}}}}}
向量字段的参数说明:
参数 | 是否必选 | 说明 |
type | 是 | dense_vector 表示稠密向量类型。 |
dims | 是 | 向量维度数,最大4096,必须与写入的向量维度严格一致。 越高则包含的信息越丰富,检索精度越高,但存储和计算成本也越高。您可以先从 384维、768维开始测试召回率/准确率,不达标则升维,达标可尝试降维。 |
similarity | 是 | 相似度计算方式,决定向量距离度量标准。 |
index_options(可选):
参数 | 是否必选 | 说明 |
type | 否 | 指定索引算法,不同ES版本的默认值不同,8.13为 hnsw,8.16为 int8_hnsw,9.1.3为 bbq_hnsw。 您可以根据向量规模参考以下信息设置: . hnsw:建议向量数量在1亿以内采用 . int8_hnsw:建议向量数量在1亿-20亿采用 . bbq_hnsw:建议向量数量在十亿到百亿采用 . bbq_disk:建议向量数量在十亿到千亿采用(diskbbq在 ES 9.2以上支持,云上版本预计Q1上线) |
m | 否 | HNSW 图中每个节点的最大连接数,默认值16。 较大的 m 会提高召回率和查询速度,但会增加索引时间和内存占用。大多数场景从 16 开始,如果对召回率要求极高,且可以接受更长索引时间和更大索引体积,可尝试增加到32或更高。 |
ef_construction | 否 | 是HNSW 索引构建时,为每个新节点寻找连接时考察的候选邻居数量,默认值100。 增大此值会提升索引质量和召回率,但会延长索引构建时间。可以从 100 开始,如果数据分布复杂或对精度要求很高可以设置200或更高。 |
相似度计算 similarity 支持4种算法如下:
算法 | 描述 |
l2_norm,欧氏距离(L2距离) | 计算空间绝对距离,数值越小越相似 |
cosine,余弦相似度 | 关注向量方向,适合语义检索 |
dot_product,向量点积 | 兼顾方向和大小,向量须先归一化为单位向量(长度为 1) |
max_inner_product,最大内积 | 适用于未归一化且长度有意义的向量 |
说明: