如何用Python客户端查询Elasticsearch中的稠密向量字段?
解决ElasticSearch稠密向量查询体构建问题
首先修正一个潜在问题:你在步骤1中将文档向量存储到了d['vector']字段,但索引mapping定义的向量字段是doc_vector,批量上传时会导致向量未写入正确字段,需修改步骤1的代码:
for d in documents: d['doc_vector']= embedder.encode(d['content'], convert_to_tensor=True) d['doc_vector'] = d['doc_vector'].numpy()
针对稠密向量的相似度搜索,以下两种常用方式可构建查询体:
方式1:使用script_score计算余弦相似度
适合需要自定义评分逻辑的场景,通过计算查询向量与文档向量的余弦相似度排序:
# 提取一维查询向量并转为列表(ElasticSearch需列表格式的向量) query_vector = encoded_query[0].tolist() query_body = { "query": { "script_score": { "query": {"match_all": {}}, # 匹配所有文档后按相似度评分排序 "script": { "source": "cosineSimilarity(params.query_vector, 'doc_vector') + 1.0", # 加1.0将余弦相似度范围[-1,1]转为正数,避免负评分 "params": {"query_vector": query_vector} } } } }
方式2:使用knn近似最近邻查询(ElasticSearch 7.10+支持)
大数据量场景下更高效的向量搜索方式:
query_vector = encoded_query[0].tolist() query_body = { "query": { "knn": { "doc_vector": { "vector": query_vector, "k": 10 # 返回最相似的10个文档 } } } }
二选一使用后,执行步骤9的搜索即可得到按相似度排序的结果。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

