索引性能调优
可以采取以下任一措施来提高索引性能,尤其是在计划一次性索引大量向量时。
禁用刷新间隔
禁用刷新间隔(默认 = 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
字段中,同时仍保持所有功能,包括使用 update
、update_by_query
和 reindex
API 的能力。
(专家级别)按需构建向量数据结构
此方法仅建议用于涉及单次初始批量上传,并且在强制合并到单个段后将仅用于搜索的工作负载。
在索引期间,向量搜索会为 knn_vector
字段构建专门的数据结构,以实现高效的近似 k-近邻 (k-NN) 搜索。然而,这些结构会在向量索引的强制合并期间重建。为了优化索引速度,请遵循以下步骤:
-
禁用向量数据结构创建:通过将
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" }
-
执行批量索引:在不进行任何搜索的情况下批量索引数据。
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 搜索运行。
-
重新启用向量数据结构创建:索引完成后,通过将
index.knn.advanced.approximate_threshold
设置为0
来启用向量数据结构创建。PUT /test-index/_settings { "index.knn.advanced.approximate_threshold": "0" }
如果在强制合并之前未将设置重置为
0
,则需要重新索引您的数据。 -
将段强制合并为一个段:执行强制合并并指定
max_num_segments=1
,以便只创建一次向量数据结构。POST test-index/_forcemerge?max_num_segments=1
强制合并后,新的搜索请求将使用新创建的数据结构执行近似 k-NN 搜索。