Link Search Menu Expand Document Documentation Menu

索引性能调优

可以采取以下任一措施来提高索引性能,尤其是在计划一次性索引大量向量时。

禁用刷新间隔

禁用刷新间隔(默认 = 1 秒)或为刷新间隔设置较长的持续时间,以避免创建多个小段。

PUT /<index_name>/_settings
{
    "index" : {
        "refresh_interval" : "-1"
    }
}

请确保在索引完成后重新启用 refresh_interval

禁用副本(无 OpenSearch 副本分片)

将副本设置为 0 可防止在主分片和副本分片中重复构建本地库索引。当您在索引完成后启用副本时,序列化的本地库索引将直接复制。如果您没有副本,节点丢失可能会导致数据丢失,因此将数据存储在其他地方非常重要,以便在出现问题时可以重试此初始加载。

增加索引线程数

如果您的硬件有多个核心,可以通过加快索引过程,允许在本地库索引构建中使用多个线程。使用 knn.algo_param.index_thread_qty 设置确定要分配的线程数。

监控 CPU 利用率并选择正确的线程数。由于本地库索引构建成本高昂,选择超过您所需的线程数可能会导致额外的 CPU 负载。

使用派生向量源功能减少存储要求

从 OpenSearch 3.0 开始,您可以使用派生向量源功能显著减少向量字段的存储要求。这是一个默认启用的索引设置。此功能可防止向量存储在 _source 字段中,同时仍保持所有功能,包括使用 updateupdate_by_queryreindex API 的能力。

(专家级别)按需构建向量数据结构

此方法仅建议用于涉及单次初始批量上传,并且在强制合并到单个段后将仅用于搜索的工作负载。

在索引期间,向量搜索会为 knn_vector 字段构建专门的数据结构,以实现高效的近似 k-近邻 (k-NN) 搜索。然而,这些结构会在向量索引的强制合并期间重建。为了优化索引速度,请遵循以下步骤:

  1. 禁用向量数据结构创建:通过将 index.knn.advanced.approximate_threshold 设置为 -1 来禁用新段的向量数据结构创建。

    要在索引创建时指定此设置,请发送以下请求:

     PUT /test-index/
     {
       "settings": {
         "index.knn.advanced.approximate_threshold": "-1"
       }
     }
    

    要在索引创建后指定此设置,请发送以下请求:

     PUT /test-index/_settings
     {
       "index.knn.advanced.approximate_threshold": "-1"
     }
    

  2. 执行批量索引:在不进行任何搜索的情况下批量索引数据。

     POST _bulk
     { "index": { "_index": "test-index", "_id": "1" } }
     { "my_vector1": [1.5, 2.5], "price": 12.2 }
     { "index": { "_index": "test-index", "_id": "2" } }
     { "my_vector1": [2.5, 3.5], "price": 7.1 }
    

    如果在禁用向量数据结构时执行搜索,它们将使用精确 k-NN 搜索运行。

  3. 重新启用向量数据结构创建:索引完成后,通过将 index.knn.advanced.approximate_threshold 设置为 0 来启用向量数据结构创建。

     PUT /test-index/_settings
     {
       "index.knn.advanced.approximate_threshold": "0"
     }
    

    如果在强制合并之前未将设置重置为 0,则需要重新索引您的数据。

  4. 将段强制合并为一个段:执行强制合并并指定 max_num_segments=1,以便只创建一次向量数据结构。

     POST test-index/_forcemerge?max_num_segments=1
    

    强制合并后,新的搜索请求将使用新创建的数据结构执行近似 k-NN 搜索。