创建向量索引
在Elasticsearch集群中创建向量索引,定义包含向量字段的Mapping(指定向量维度、索引算法、相似度度量方式等)。将特征向量数据(通常连同原始数据或元数据)索引到Elasticsearch中。
登录Kibana
登录Kibana进入命令执行页面。Elasticsearch集群支持多种客户端访问,本文仅以CSS服务集成的Kibana为例介绍配置指导。
- 登录云搜索服务管理控制台。
- 在左侧导航栏,选择“集群管理 > Elasticsearch”。
- 在集群列表,选择目标集群,单击操作列的“Kibana”,登录Kibana。
- 在Kibana左侧导航栏选择“Dev Tools”,进入操作页面。
创建向量索引
在Kibana中执行以下命令,创建向量索引。
例如,创建一个名为“my_index”的索引,该索引包含一个名为“my_vector”的向量字段和一个名为“my_label”的文本字段,其中,向量字段创建了GRAPH图索引,并使用欧式距离作为相似度度量。
PUT my_index { "settings": { "index": { "vector": true, "number_of_shards": 1, "number_of_replicas": 1 } }, "mappings": { "properties": { "my_vector": { "type": "vector", "dimension": 2, "indexing": true, "algorithm": "GRAPH", "metric": "euclidean" }, "my_label": { "type": "keyword" } } } }
参数 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
index.vector |
是 |
Boolean |
是否启用向量索引功能。 该参数值必须配置为“true”,否则无法创建向量索引。 |
index.number_of_shards |
否 |
Integer |
索引的分片数量,通常设置为节点数的整数倍。 取值范围:1~1024 默认值:1 |
index.number_of_replicas |
否 |
Integer |
索引的副本数量,副本用于数据冗余和提升高可用性。 取值范围:0~节点数-1 默认值:1 |
index.vector.exact_search_threshold |
否 |
Integer |
控制从前置过滤搜索自动切换到暴力搜索的阈值。当Segment中过滤后的中间结果集数量小于此值时,执行暴力搜索。 取值范围:null(不启用切换)或正整数。 默认值:null(不切换)。 |
index.vector.search.concurrency.enabled |
否 |
Boolean |
是否开启Segment间并发搜索。在Elasticsearch中,每个索引分片由多个Segment组成,执行查询时默认采用Segment间串行搜索机制。开启Segment间并发搜索,查询可在满足条件的Segment上并行执行,可降低查询时延,但并不会提升集群的最大查询吞吐量,同时集群的平均CPU使用率可能会升高。 仅支持Elasticsearch 7.10.2集群且镜像版本号不低于7.10.2_25.3.0_x.x.x。
取值范围:
|
参数 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
type |
是 |
String |
字段类型,定义字段存储的数据类型。 该参数值必须配置为“vector”,不可更改,用于标识向量字段。 |
dimension |
是 |
Integer |
向量数据维度,指定向量数据的长度。 取值范围:1~4096 |
indexing |
否 |
Boolean |
是否开启向量索引加速。
取值范围:
|
lazy_indexing |
否 |
Boolean |
是否开启向量索引延迟构建。在数据写入后,延迟构建索引,适用于离线场景。 仅在“indexing”为“true”,且集群版本为Elasticsearch 7.10.2、集群镜像版本号不低于7.10.2_24.3.3_x.x.x的情况下,配置lazy_indexing才会生效。
取值范围:
|
algorithm |
否 |
String |
向量索引的算法类型。 仅当“indexing”为“true”时生效。当选择“IVF_GRAPH”或“IVF_GRAPH_PQ”算法类型时,需要(可选)预构建与注册中心点向量。
取值范围:
当算法类型选择GRAPH、GRAPH_PQ、GRAPH_SQ8和GRAPH_SQ4时,为了获得更高的查询性能以及查询精度,CSS提供了可选参数配置,如表3和表4所示。 |
dim_type |
否 |
String |
向量维度值的类型,指定向量数据的数值类型。
取值范围:
|
metric |
否 |
String |
向量距离度量方式。定义向量之间相似度或距离的计算方法。 取值范围:
|
参数 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
neighbors |
否 |
Integer |
图索引(GRAPH类)中每个向量的邻居数。影响查询精度和速度,值越大查询精度越高但构建速度和查询速度变慢。 仅当“indexing”为“true”,且“algorithm”为GRAPH、GRAPH_PQ、GRAPH_SQ8或GRAPH_SQ4时,才生效。 取值范围:20~255 默认值:64 |
shrink |
否 |
Float |
图索引(GRAPH类)构建HNSW时的裁边系数。影响HNSW图的结构。 默认值1.0f。 仅当“indexing”为“true”,且“algorithm”为GRAPH、GRAPH_PQ、GRAPH_SQ8或GRAPH_SQ4时,才生效。 取值范围:0.1~10 默认值:1 |
scaling |
否 |
Integer |
图索引(GRAPH类)构建HNSW时上层图节点数的缩放比例。影响HNSW图的层级结构。 仅当“indexing”为“true”,且“algorithm”为GRAPH、GRAPH_PQ、GRAPH_SQ8或GRAPH_SQ4时,才生效。 取值范围:0~128 默认值:50 |
efc |
否 |
Integer |
图索引(GRAPH类)构建HNSW时考察邻居节点的队列大小。影响查询精度,值越大精度越高,但构建速度变慢。 仅当“indexing”为“true”,且“algorithm”为GRAPH、GRAPH_PQ、GRAPH_SQ8或GRAPH_SQ4时,才生效。 取值范围:0~100000 默认值:200 |
max_scan_num |
否 |
Integer |
图索引(GRAPH类)的扫描节点上限。影响查询精度,值越大精度越高,但索引速度变慢。 仅当“indexing”为“true”,且“algorithm”为GRAPH、GRAPH_PQ、GRAPH_SQ8或GRAPH_SQ4时,才生效。 取值范围:0~1000000 默认值:10000 |
参数 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
centroid_num |
否 |
Integer |
GRAPH_PQ索引每段聚类中心点数目。影响PQ量化精度和存储。 仅当“indexing”为“true”,且“algorithm”为GRAPH_PQ时,才生效。 取值范围:0~65535 默认值:255 |
fragment_num |
否 |
Integer |
GRAPH_PQ索引的段数。影响PQ量化划分。 段数,默认值为0,插件自动根据向量长度设置合适的段数。 仅当“indexing”为“true”,且“algorithm”为GRAPH_PQ时,才生效。 取值范围:0~4096 默认值:0(系统会自动根据向量长度设置合适的段数) |
(可选)预构建与注册中心点向量
当向量索引的索引算法选择“IVF_GRAPH”或“IVF_GRAPH_PQ”时,需要先对中心点向量进行预构建和注册。
在向量索引加速算法中,“IVF_GRAPH”和“IVF_GRAPH_PQ”适用于超大规模场景。这两种算法需要通过对子空间的切割缩小查询范围,子空间的划分通常采用聚类或者随机采样的方式。在预构建之前,需要通过聚类或者随机采样得到所有的中心点向量。通过预构建和注册将中心点向量预构建成GRAPH或者GRAPH_PQ索引,同时注册到CSS集群内,实现在多个节点间共享此索引文件。中心点索引在Shard间复用能够有效减少训练的开销、中心点索引的查询次数,进而提升写入和查询性能。
- 创建中心点索引表。
例如,在Kibana中执行以下命令,创建中心点索引表“my_dict”。
PUT my_dict { "settings": { "index": { "vector": true }, "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { "my_vector": { "type": "vector", "dimension": 2, "indexing": true, "algorithm": "GRAPH", "metric": "euclidean" } } } }
参数说明请参见创建向量索引,需要关注以下必配参数:- index.number_of_shards:索引分片数必须配置为“1”,否则无法注册中心点索引。
- indexing:必须配置为“true”,开启向量索引加速。
- algorithm:必须对应于特定的索引类型。当使用IVF_GRAPH索引时配置为“GRAPH”,当需要使用IVF_GRAPH_PQ索引时配置为“GRAPH_PQ”。
- 写入中心点向量数据。将采样或者聚类得到的中心点向量写入新建的中心点索引表“my_dict”中。
- 调用注册接口。
在Kibana中执行以下命令,将中心点索引表注册具有全局唯一标识名称(dict_name)的Dict对象。
PUT _vector/register/my_dict { "dict_name": "my_dict" }
- 创建IVF_GRAPH或IVF_GRAPH_PQ算法类型的向量索引。
在创建向量索引时,不再需要指定dimension以及metric信息,但需要指定注册好的Dict对象。如表5所示,提供了指定Dict对象的关键参数说明,其他创建索引的参数说明请参见创建向量索引。
例如执行如下命令创建IVF_GRAPH类型的向量索引。
PUT my_index { "settings": { "index": { "vector": true, "sort.field": "my_vector.centroid" # 将向量字段的centroid子字段设置为排序字段 } }, "mappings": { "properties": { "my_vector": { "type": "vector", "indexing": true, "algorithm": "IVF_GRAPH", "dict_name": "my_dict", "offload_ivf": true } } } }