You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:35:26