ES 9.3.0 环境下的完整 DSL 示例,涵盖索引 mapping 创建、向量数据插入、混合搜索(BM25 + 向量)+ RRF 排序全流程。以下示例基于 ES 9.3.0 原生语法,适配其向量检索、RRF 融合等核心能力,且包含详细注释和运行说明。
前置说明
-
示例场景:模拟企业知识库问答,存储文档的文本内容 + 稠密向量嵌入(768维,适配主流开源模型如 BERT、all-MiniLM-L6-v2)。
-
依赖:ES 9.3.0 集群需启用 ML 节点(用于向量生成/检索,或也可提前用外部模型生成向量后直接插入)。
-
核心能力:
-
dense_vector字段存储向量,启用 HNSW 近似最近邻检索(ES 9.3.0 推荐); -
BM25f 多字段加权排序;
-
RRF 融合 BM25 关键词结果 + 向量语义结果。
-
1. 创建索引(含 mapping 定义)
JSON
# 创建名为 "enterprise_knowledge_base" 的索引,适配 ES 9.3.0 语法
PUT /enterprise_knowledge_base
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
# 启用 BM25f 相似度算法(混合搜索核心)
"index": {
"similarity": {
"custom_bm25f": {
"type": "BM25",
"b": 0.75, # 字段长度归一化参数,0.75 为 ES 默认值
"k1": 1.2 # 词频饱和参数,1.2 为 ES 默认值
}
}
}
},
"mappings": {
"properties": {
# 文档标题(高权重字段)
"title": {
"type": "text",
"similarity": "custom_bm25f", # 应用自定义 BM25f
"boost": 3.0 # 标题权重是内容的 3 倍
},
# 文档内容(核心文本字段)
"content": {
"type": "text",
"similarity": "custom_bm25f"
},
# 文档分类(辅助过滤)
"category": {
"type": "keyword"
},
# 稠密向量字段(768维,适配主流开源模型)
"content_embedding": {
"type": "dense_vector",
"dims": 768, # 向量维度,需与你的嵌入模型一致
"index": true, # 启用索引,支持检索
"similarity": "cosine", # 相似度计算方式:余弦相似度(ES 9.3.0 支持 cosine/l2/dot_product)
"index_options": {
"type": "hnsw", # 近似最近邻算法,ES 9.3.0 推荐
"m": 16, # HNSW 节点数,平衡精度与性能
"ef_construction": 100 # 构建时的精度参数
}
}
}
}
}
2. 插入测试数据(含向量)
注意:以下 content_embedding 为模拟的 768 维向量(仅展示前 5 位,实际需替换为模型生成的真实向量),可直接复制运行(ES 会忽略向量长度不一致的提示?不,需保证维度为 768,此处为简化展示)。
JSON
# 插入第一条文档
POST /enterprise_knowledge_base/_doc/1
{
"title": "Elasticsearch 9.3.0 向量检索使用指南",
"content": "Elasticsearch 9.3.0 原生支持 dense_vector 字段和 HNSW 算法,可实现高效的语义检索,配合 RRF 可融合关键词与向量结果。",
"category": "技术文档",
"content_embedding": [0.123, 0.456, 0.789, 0.012, 0.345, ...] # 替换为真实 768 维向量
}
# 插入第二条文档
POST /enterprise_knowledge_base/_doc/2
{
"title": "ESRE 混合搜索最佳实践",
"content": "ESRE 中的 RRF 算法可将 BM25 关键词搜索结果与向量语义搜索结果融合,提升搜索相关性,无需手动调权。",
"category": "技术文档",
"content_embedding": [0.234, 0.567, 0.890, 0.123, 0.456, ...] # 替换为真实 768 维向量
}
# 插入第三条文档(无关文档,用于测试排序效果)
POST /enterprise_knowledge_base/_doc/3
{
"title": "Python 基础语法教程",
"content": "Python 是一种解释型、面向对象的编程语言,常用于数据分析和脚本开发。",
"category": "编程教程",
"content_embedding": [0.987, 0.654, 0.321, 0.908, 0.765, ...] # 替换为真实 768 维向量
}
3. 混合搜索 + RRF 排序
ES 9.3.0 原生支持 rank_eval 或 search 中的 rrf 融合,以下是最简可用的混合搜索 DSL:
JSON
# 混合搜索:BM25 关键词搜索 + 向量语义搜索 + RRF 融合排序
POST /enterprise_knowledge_base/_search
{
"size": 10,
# 定义两个检索请求:q1(BM25 关键词)、q2(向量语义)
"requests": [
{
"id": "q1", # 关键词检索 ID
"body": {
"query": {
"multi_match": {
"query": "Elasticsearch 9.3.0 向量检索 RRF", # 用户查询词
"fields": ["title^3", "content"], # 标题权重 3 倍,对应 mapping 中的 boost
"type": "best_fields",
"similarity": "custom_bm25f"
}
}
}
},
{
"id": "q2", # 向量语义检索 ID
"body": {
"query": {
"knn": { # ES 9.3.0 原生 KNN 检索
"content_embedding": {
"vector": [0.156, 0.489, 0.723, 0.045, 0.378, ...], # 用户查询词的 768 维向量
"k": 5, # 返回 Top5 相似结果
"num_candidates": 10 # 候选集大小,大于 k 即可
}
}
}
}
}
],
# RRF 融合配置(ES 9.3.0 核心)
"rank_eval": {
"metric": {
"rrf": {
"window_size": 100, # 参与融合的结果窗口大小
"constant": 60 # RRF 常数(默认 60,越大越侧重排名靠前的结果)
}
},
"fusion": {
"type": "rrf", # 指定融合方式为 RRF
"params": {
"window_size": 100,
"constant": 60
}
}
}
}
简化版 RRF 搜索(ES 9.3.0 另一种写法)
如果上述 rank_eval 写法较复杂,也可使用 search + collapse 配合 RRF(更贴近业务场景):
JSON
POST /enterprise_knowledge_base/_search
{
"size": 10,
"query": {
"bool": {
"should": [
# BM25 关键词检索
{
"multi_match": {
"query": "Elasticsearch 9.3.0 向量检索 RRF",
"fields": ["title^3", "content"],
"boost": 1.0
}
},
# 向量语义检索
{
"script_score": {
"query": { "match_all": {} },
"script": {
"source": "cosineSimilarity(params.query_vector, 'content_embedding') + 1.0", # 余弦相似度(+1 避免负数)
"params": {
"query_vector": [0.156, 0.489, 0.723, 0.045, 0.378, ...] # 用户查询向量
}
}
}
}
]
}
},
# RRF 排序(ES 9.3.0 原生支持)
"rank": {
"rrf": {
"window_size": 50,
"constant": 60
}
}
}
4. 运行验证与结果说明
-
运行步骤:
-
先执行"创建索引"DSL,确认返回
{"acknowledged":true}; -
再执行"插入测试数据",确认每条返回
{"result":"created"}; -
最后执行"混合搜索 + RRF",查看返回结果。
-
-
预期结果:
-
文档 1(Elasticsearch 9.3.0 向量检索)和文档 2(ESRE RRF)会排在前两位;
-
文档 3(Python 教程)会排在最后(或不返回);
-
RRF 会自动融合 BM25(关键词匹配)和向量(语义匹配)的得分,无需手动调整权重。
-
总结
-
核心配置 :ES 9.3.0 中
dense_vector字段需指定index: true+hnsw索引类型,向量维度需与嵌入模型一致; -
RRF 关键 :通过
rank.rrf或rank_eval.fusion实现混合搜索结果融合,constant: 60为行业通用默认值; -
BM25f 优化 :通过
similarity自定义 BM25 参数,通过boost给不同字段加权,提升关键词检索精度。
如果运行中遇到"向量维度不匹配""hnsw 索引未启用"等问题,可检查:
-
content_embedding的dims是否与插入的向量维度一致; -
ES 9.3.0 集群是否启用 ML 模块(
xpack.ml.enabled: true); -
索引创建时是否有语法错误(ES 9.3.0 对
dense_vector的index_options语法要求严格)。