Elastic search浅析

Elastic search浅析

背景

在软件开发过程中,数据库通常承担数据持久化与结构化查询的任务。关系型数据库可以通过主键、外键、索引和 SQL 条件查询来完成数据检索。然而,假如我想在数据库中搜索某段文字如“如何优化大模型知识库召回效果”,效果往往较差。因为这类问题并不只是简单的 WHERE title = ... 或 LIKE '%keyword%',而是涉及全文检索

Elasticsearch 正是为了解决这类问题而广泛使用的搜索与分析引擎。它基于 Apache Lucene 构建,提供了分布式、近实时、高性能的全文检索能力。

在关系型数据库中,如果希望检索包含某个关键词的文章,可能会使用:

SELECT * FROM articles WHERE content LIKE '%Elasticsearch%';

这种方式在数据量较小时可以接受,但当文档数量达到百万级、千万级甚至更大时,性能和搜索质量都会遇到明显瓶颈。
而 Elasticsearch 会通过倒排索引快速定位包含目标词项的文档,并根据 BM25 等相关性算法为结果排序。这使它更适合构建站内搜索、日志检索、文档问答和知识库检索系统

基本思想

当一篇文档被写入 Elasticsearch 时,它并不是简单地以原文形式存储起来。Elasticsearch 会根据字段类型和分析器配置,对文本进行分词、标准化、建立倒排索引等处理。倒排索引可以理解为:从词到文档的映射。

例如,有三篇文档:

文档1:Elasticsearch 是一个搜索引擎
文档2:搜索引擎使用倒排索引
文档3:RAG 系统需要检索文档

建立倒排索引后,系统可以知道:

搜索引擎 -> 文档1,文档2
倒排索引 -> 文档2
检索 -> 文档3

这样,当用户搜索“搜索引擎”时,Elasticsearch 就可以快速定位相关文档,而不需要逐篇扫描全部内容。

分词

英文文本通常可以根据空格和标点进行切分,而中文文本没有天然空格,因此需要专门的中文分词器。

我正在学习 Elasticsearch 搜索引擎

可能被切分为:

我 / 正在 / 学习 / Elasticsearch / 搜索引擎

分词质量会直接影响搜索效果。如果分词不合理,用户即使输入了正确的关键词,也可能无法召回理想文档。
3a9f47e9535b6cb935943e0a89d49b23

Mapping

Mapping 用于定义字段类型。例如:

{
  "title": {
    "type": "text"
  },
  "created_at": {
    "type": "date"
  },
  "author_id": {
    "type": "keyword"
  }
}

其中:

  • text 类型适合全文检索,会进行分词;
  • keyword 类型适合精确匹配,不进行分词;
  • date 适合时间范围查询;
  • integer、float 等适合数值查询;
  • dense_vector 可用于向量检索。
    Mapping 的设计会直接影响搜索能力和性能。如果将需要全文检索的字段错误地设置为 keyword,则搜索效果会受到限制;如果将只需要精确匹配的字段设置为 text,则可能带来不必要的分词和索引开销。
    4f7c5454e95ca01d59aa1325aab56ad2

RAGFlow中ES的设计

在RagFlow中,默认配置的文档引擎是elasticsearch。

主要包含

一条 chunk 文档同时承载多种信息:

原文:content_with_weight

分词字段:content_ltks、content_sm_ltks、title_tks

关键词/假问句:important_kwd、question_kwd、question_tks

向量:q_{dim}_vec,支持不同 embedding 维度共存

元数据与定位:kb_id、doc_id、page_num_int、position_int、bbox

检索流程:BM25 全文召回 + KNN 向量召回并行,应用层做分数归一化后加权融合,默认 tkweight=0.3、vtweight=0.7。

多粒度权重:正文 1×、标题 2×、important_kwd 5×、question_tks 6×。

重排:token 相似度 + 向量相似度 + rank_feature,并配合两段式查询策略。

RAGFlow+ES 和 父子切分端侧RAG 对比

RAGFlow优势

  • 假问句生成:RAGFlow 调 LLM 生成

统的RAG是直接用用户简短、口语化的提问去匹配文档中完整、详尽的答案,这种“问题”与“答案”之间的语义维度往往不匹配。假设问题索引则提前为每个知识段落构思出它可能回答的“假设性问题”,并为这些问题建立专门的向量索引。利用大语言模型分析每个文档分块,生成3到5个与之相关的假设性问题。例如,对于“本公司差旅补助标准为每天200元”这段文本,可能会生成“出差补贴是多少?”、“每日补助标准是多少?”等问题。当用户提出真实问题时,系统将其向量化,并与“假设问题库”进行相似度比对。匹配到最相似的假设问题后,系统会回溯到它所指向的原始文本片段,并基于此生成最终回答。

  • 多粒度权重 1/2/5/6:RAGFlow 应用层决定
  • 分数归一化融合:RAGFlow 自定义

ES优势

  • dense_vector + kNN
  • 分布式、副本、快照、安全、可观测性。
  • 统一检索底座

端侧局限

ES自身稳态占用就达到5-6GB,加上数据远远不可用
RAGflow最低要求16G内存,推荐是32G,端侧设备不可用
MinerU+父子切分(章节分块):缩小甚至追平解析和分块差距

posted @ 2026-09-27 15:57  Sun-Wind  阅读(12)  评论(0)    收藏  举报