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 语法要求严格)。

相关推荐
Volunteer Technology1 小时前
Oracle高级部分(触发器)
数据库·oracle
AI周红伟2 小时前
周红伟:Sglang+Vllm+Qwen3.5企业级部署案例实操
大数据·人工智能·大模型·智能体
zhangyueping83852 小时前
5、MYSQL-DQL-多表关系
数据库·mysql
kimi-2222 小时前
在 AutoDL 容器内安装 PostgreSQL + pgvector
数据库·postgresql
番茄去哪了2 小时前
苍穹外卖day07---Redis缓存优化与购物车功能实现
java·数据库·ide·spring boot·spring·maven·mybatis
切糕师学AI2 小时前
MongoDB 是什么?
数据库·mongodb
学历真的很重要3 小时前
【系统架构师】第三章 数据库系统知识 - 数据库基础到关系代数(详细版)
数据库·学习·职场和发展·系统架构·系统架构师
亓才孓3 小时前
【MyBatis Plus】Wrapper接口
java·开发语言·数据库·spring boot·mybatis
nudt_qxx3 小时前
Ubuntu 26.04 LTS“坚毅浣熊”(Resolute Raccoon) 新特性前瞻
linux·数据库·ubuntu