这篇说说 kNN 搜索的基本要点,你可以参阅此文档了解更多详情。
一、单向量搜索
这是最基本的向量搜索方式,针对单个向量字段进行相似度搜索:
GET /book-index/_search{ "knn": { "field": "title_vector", "query_vector": [0.1, 0.2, 0.3 …], "k": 10, // 返回的 top k 结果数量 "num_candidates": 100 // 指定每个分片上要检索的候选向量数量 } "fields": ["id", "title_text", "category"], "_source": false,}
参数说明:
·field: 要搜索的向量字段名
·query_vector: 查询向量,维度必须与字段定义一致
·k: 返回的最相似文档数量
·num_candidates: 在每个分片上考虑的候选向量数量,值越大精度越高但性能越差
当然,你可以直接输入查询文本,通过在线推理生成查询向量(下同):
GET /book-index/_search{ "knn": { "field": "title_vector", "query_vector_builder": { "text_embedding": { "model_id": "model-bge-base", "model_text": "人类简史" } }, "k": 10, // 返回的 top k 结果数量 "num_candidates": 100 // 指定每个分片上要检索的候选向量数量 }, "fields": ["id", "title_text", "category"], "_source": false}
二、多向量搜索
ES 支持同时对多个向量字段进行搜索,并合并结果。
GET /book-index/_search{ "query": { "bool": { "should": [ { "knn": { "field": "title_vector", "query_vector": [0.1, 0.2, 0.3 …], "k": 5, "num_candidates": 50, "boost": 0.8 } }, { "knn": { "field": "content_vector", "query_vector": [0.1, 0.2, 0.3, …], "k": 5, "num_candidates": 50, "boost": 0.2 } } ] } }}
特点:
·两个搜索并行执行。
·结果按分数合并排序。
·可使用 boost 参数调整各字段权重。
·相同文档在不同搜索结果中出现时,取最高分。