阿里云Elasticsearch向量引擎功能,用于处理大规模的向量数据。它结合了Elasticsearch的强大搜索功能和向量相似度计算能力,适用于推荐系统、图像检索、自然语言处理等场景。本文将介绍如何高效地使用阿里云Elasticsearch向量引擎,并为您提供一些最佳实践建议。阿里云Elasticsearch的向量引擎正在不断迭代,因此建议使用最新版本的阿里云Elasticsearch,以确保在性能、成本和用户体验方面获得最佳效果。
前提条件
已创建ES实例,如您未创建实例,请参见初级版:从实例创建到数据检索(创建阿里云ES 8.x的最新版本)。
向量引擎需要大量堆外内存cache向量索引。在选择规格时,可依据下文关于内存计算的说明,评估堆外内存的使用情况,从而选择合适的数据节点规格及其数量。
操作指引
1.创建索引
创建一个适合存储向量数据的索引是首要步骤。以下是一个示例索引定义:
PUT /my_vector_index
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"my_vector": {
"type": "dense_vector",
"dims": 3
},
"my_text" : {
"type" : "keyword"
}
}
}
}number_of_shards和number_of_replicas的设置取决于您的数据规模和性能需求。dense_vector类型用于存储向量数据,dims参数指定了向量的维度。dense_vector的参数很多,具体请参见Dense vector field type。
2.数据导入
您可以使用多种方式将数据导入到Elasticsearch向量索引中,例如使用Bulk API批量导入数据。以下是一个示例:
PUT my_vector_index/_doc/1
{
"my_text" : "text1",
"my_vector" : [0.5, 10, 6]
}
PUT my_vector_index/_doc/2
{
"my_text" : "text2",
"my_vector" : [-0.5, 10, 10]
}请确保向量数据的维度与索引定义中的维度一致。
3.向量搜索
使用Elasticsearch的向量相似度搜索功能,可以通过指定查询向量来查找最相似的文档。以下是一个示例查询:
GET my_vector_index/_search
{
"knn": {
"field": "my_vector",
"query_vector": [-5, 9, -12],
"k": 10,
"num_candidates": 100
},
"fields": [ "my_text" ]
}参数 | 内容 |
| (可选)表示返回的最近邻居的数量。该值必须小于或等于 |
| (可选)每个分片需考虑的最近邻居候选数量。该参数对性能和召回率具有显著影响, |
关于k和num_candidates参数的说明:num_candidates在HNSW中指的是查询的ef值,它表示在分片中收集的最临近的num_candidates个文档,而k则是Elasticsearch最终在结果中返回的doc数量。
更多向量搜索的功能包括:
knn可以支持filter查询。可以支持similarity,设置最小score的命中doc。可以支持nested字段。支持同时查询多个
knn字段。支持使用
script进行精确knn查询。支持使用
script进行rescore。完整功能请参见k-nearest neighbor (knn) search。