更新时间:2025-07-29 GMT+08:00

创建向量索引

在Elasticsearch集群中创建向量索引,定义包含向量字段的Mapping(指定向量维度、索引算法、相似度度量方式等)。将特征向量数据(通常连同原始数据或元数据)索引到Elasticsearch中。

登录Kibana

登录Kibana进入命令执行页面。Elasticsearch集群支持多种客户端访问,本文仅以CSS服务集成的Kibana为例介绍配置指导。

  1. 登录云搜索服务管理控制台。
  2. 在左侧导航栏,选择“集群管理 > Elasticsearch”
  3. 在集群列表,选择目标集群,单击操作列的“Kibana”,登录Kibana。
  4. 在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"
      }
    }
  }
}
表1 settings参数说明

参数

是否必选

参数类型

描述

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。

取值范围:
  • true:并发搜索。
  • false(默认值):串行搜索。
表2 mappings参数说明

参数

是否必选

参数类型

描述

type

String

字段类型,定义字段存储的数据类型。

该参数值必须配置为“vector”,不可更改,用于标识向量字段。

dimension

Integer

向量数据维度,指定向量数据的长度。

取值范围:1~4096

indexing

Boolean

是否开启向量索引加速。

取值范围:
  • true:开启向量索引加速,系统将创建额外的向量索引,索引算法由“algorithm”参数指定,写入数据后可以使用VectorQuery进行查询。
  • false(默认值):关闭向量索引加速,向量数据仅写入docvalues,只支持使用ScriptScore以及Rescore进行向量查询。

lazy_indexing

Boolean

是否开启向量索引延迟构建。在数据写入后,延迟构建索引,适用于离线场景。

仅在“indexing”“true”,且集群版本为Elasticsearch 7.10.2、集群镜像版本号不低于7.10.2_24.3.3_x.x.x的情况下,配置lazy_indexing才会生效。

取值范围:
  • true:开启延迟构建。写入向量数据时不会实时创建向量索引结构(比如图索引),在数据写入后执行离线构建才开始构建索引。构建完成后才可使用VectorQuery进行查询。
  • false(默认值):不开启延迟构建。

algorithm

String

向量索引的算法类型。

仅当“indexing”“true”时生效。当选择“IVF_GRAPH”“IVF_GRAPH_PQ”算法类型时,需要(可选)预构建与注册中心点向量

取值范围:
  • FLAT:暴力计算,目标向量依次和所有向量进行距离计算,此方法计算量大,召回率100%。适用于对召回准确率要求极高的场景。
  • GRAPH(默认值):图索引,内嵌深度优化的HNSW算法,主要应用在对性能和精度均有较高要求且单分片文档数量在千万量级的场景。
  • GRAPH_PQ:将HNSW算法与PQ算法进行了结合,通过PQ降低原始向量的存储开销,能够使HNSW轻松支撑上亿规模的检索场景。
  • GRAPH_SQ8:将HNSW算法与SQ量化算法进行了结合,将float32数值类型量化为int8,降低原始向量的存储开销,并提升构建和查询效率,但会带来一定的召回率下降。仅Elasticsearch 7.10.2版本的集群支持。
  • GRAPH_SQ4:将HNSW算法与SQ量化算法进行了结合,将float32数值类型量化为int4,降低原始向量的存储开销,并提升构建和查询效率,但会带来一定的召回率损失。SQ4量化压缩率高于SQ8,且计算效率更高,但召回率下降也会更多。仅Elasticsearch 7.10.2版本的集群支持。
  • IVF_GRAPH:算法将IVF与HNSW结合,对全量空间进行划分,每一个聚类中心向量代表了一个子空间,极大地提升检索效率,同时会带来微小的检索精度损失。适用于数据量在上亿以上同时对检索性能要求较高的场景。
  • IVF_GRAPH_PQ:PQ算法与IVF-HNSW的结合,PQ可以通过配置选择与HNSW结合和IVF结合,进一步提升系统的容量并降低系统开销,适用于shard中文档数量在十亿级别以上同时对检索性能要求较高的场景。

当算法类型选择GRAPH、GRAPH_PQ、GRAPH_SQ8和GRAPH_SQ4时,为了获得更高的查询性能以及查询精度,CSS提供了可选参数配置,如表3表4所示。

dim_type

String

向量维度值的类型,指定向量数据的数值类型。

取值范围:
  • binary:二值向量。
  • float(默认值):浮点数向量。

metric

String

向量距离度量方式。定义向量之间相似度或距离的计算方法。

取值范围:

  • euclidean(默认值):欧式距离。
  • inner_product:内积距离。
  • cosine:余弦距离。
  • hamming:汉明距离,仅支持“dim_type”“binary”时使用。
表3 GRAPH类索引算法的可选参数说明

参数

是否必选

参数类型

描述

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

表4 GRAPH_PQ索引算法的可选参数说明

参数

是否必选

参数类型

描述

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间复用能够有效减少训练的开销、中心点索引的查询次数,进而提升写入和查询性能。

  1. 创建中心点索引表。

    例如,在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”
  2. 写入中心点向量数据。将采样或者聚类得到的中心点向量写入新建的中心点索引表“my_dict”中。
  3. 调用注册接口。

    在Kibana中执行以下命令,将中心点索引表注册具有全局唯一标识名称(dict_name)的Dict对象。

    PUT _vector/register/my_dict 
     { 
       "dict_name": "my_dict" 
     }
  4. 创建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 
           } 
         } 
       } 
     }
    表5 Field Mappings参数说明

    参数

    是否必选

    参数类型

    描述

    dict_name

    String

    指定依赖的中心点索引名称,例如“my_dict”。该索引字段的向量维度和度量方式将与dict索引保持一致,不再需要额外指定。

    offload_ivf

    Boolean

    是否将IVF倒排索引卸载到ES端实现。

    取值范围:true、false。
    • true(推荐值):卸载,将底层索引实现的IVF倒排索引卸载到ES端实现,可以减少堆外内存的使用,以及减少写入/合并的性能开销。
    • false(默认值):不卸载。