ES 9.3.0 DSL 示例:从索引创建到混合搜索与 RRF 排序

ES 9.3.0 环境下的完整 DSL 示例,涵盖索引 mapping 创建、向量数据插入、混合搜索(BM25 + 向量)+ RRF 排序全流程。以下示例基于 ES 9.3.0 原生语法,适配其向量检索、RRF 融合等核心能力,且包含详细注释和运行说明。

前置说明

  1. 示例场景:模拟企业知识库问答,存储文档的文本内容 + 稠密向量嵌入(768维,适配主流开源模型如 BERT、all-MiniLM-L6-v2)。

  2. 依赖:ES 9.3.0 集群需启用 ML 节点(用于向量生成/检索,或也可提前用外部模型生成向量后直接插入)。

  3. 核心能力:

    • 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_evalsearch 中的 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. 运行验证与结果说明

  1. 运行步骤

    • 先执行"创建索引"DSL,确认返回 {"acknowledged":true}

    • 再执行"插入测试数据",确认每条返回 {"result":"created"}

    • 最后执行"混合搜索 + RRF",查看返回结果。

  2. 预期结果

    • 文档 1(Elasticsearch 9.3.0 向量检索)和文档 2(ESRE RRF)会排在前两位;

    • 文档 3(Python 教程)会排在最后(或不返回);

    • RRF 会自动融合 BM25(关键词匹配)和向量(语义匹配)的得分,无需手动调整权重。


总结

  1. 核心配置 :ES 9.3.0 中 dense_vector 字段需指定 index: true + hnsw 索引类型,向量维度需与嵌入模型一致;

  2. RRF 关键 :通过 rank.rrfrank_eval.fusion 实现混合搜索结果融合,constant: 60 为行业通用默认值;

  3. BM25f 优化 :通过 similarity 自定义 BM25 参数,通过 boost 给不同字段加权,提升关键词检索精度。

如果运行中遇到"向量维度不匹配""hnsw 索引未启用"等问题,可检查:

  • content_embeddingdims 是否与插入的向量维度一致;

  • ES 9.3.0 集群是否启用 ML 模块(xpack.ml.enabled: true);

  • 索引创建时是否有语法错误(ES 9.3.0 对 dense_vectorindex_options 语法要求严格)。

相关推荐
方向研究1 天前
汽油生产
大数据
执笔画情ora1 天前
Postgresql数据库管理-pg_xact
数据库·postgresql·oracle
码农小白AI1 天前
IACheck AI报告文档审核:高端制造合规新助力,保障标准引用报告质量
大数据·人工智能·制造
南棱笑笑生1 天前
20260310在瑞芯微原厂RK3576的Android14查看系统休眠时间
服务器·网络·数据库·rockchip
XDHCOM1 天前
ORA-32152报错咋整啊,数据库操作遇到null number问题远程帮忙修复
服务器·数据库·oracle
专利观察员1 天前
输配电行业创新转型实践:南宁迪**力有限公司的专利策略调整、专利检索工具采用
数据库·科技·专利·专利申请
jgyzl1 天前
2026.3.9 Redis内存回收内存淘汰
数据库·redis·缓存
泰迪智能科技1 天前
分享|高校必备三大实训管理平台,助力高校人工智能、大数据、商务数据分析人才培养
大数据·人工智能·数据分析
白露与泡影1 天前
MySQL 时间类型选型避坑:timestamp 和 datetime 该怎么选?
数据库·mysql
GJGCY1 天前
2026企业级AI智能体架构对比:RPA+大模型融合在财务场景的表现
大数据·人工智能·ai·rpa·智能体