agentic_huge_data_base / wiki
页面 RAGFlow · 9.2 查询处理与 Hybrid 检索·DeepWiki 中文全文译文

9.2 · 查询处理与 Hybrid 检索(Query Processing and Hybrid Search)

复杂文档理解与引用检索 · 本章是 RAGFlow DeepWiki 中文译文的独立章节页,保留原始链接、源码锚点、模块标签和章节层级。

项目RAGFlow 章节9.2 状态全文译文 模块检索、召回与索引、入库与解析、文档对象与元数据、系统架构
源码线索
  • api/db/__init__.py
  • api/db/db_models.py
  • api/db/services/dialog_service.py
  • api/db/services/document_service.py
  • api/db/services/file_service.py
  • api/db/services/knowledgebase_service.py
  • api/db/services/llm_service.py
  • api/db/services/task_service.py
  • api/db/services/user_service.py
  • common/metadata_utils.py
模块标签
  • 检索、召回与索引
  • 入库与解析
  • 文档对象与元数据
  • 系统架构
  • 界面与交互

中文译文

查询处理与 Hybrid 检索(中文译文)

原始 DeepWiki 页面:https://deepwiki.com/infiniflow/ragflow/9.2-query-processing-and-hybrid-search
翻译时间:2026-05-27T08:44:42.692Z
翻译模型:deepseek-chat
原文字符数:11202
项目:RAGFlow (ragflow)

--- 好的,作为一名资深技术文档翻译专家,我将严格遵循您的要求,对这份 DeepWiki 技术文档进行全文翻译和润色。

---

查询处理与混合搜索

相关源文件

以下文件被用作生成此 Wiki 页面的上下文:

  • api/db/__init__.py
  • api/db/db_models.py
  • api/db/services/dialog_service.py
  • api/db/services/document_service.py
  • api/db/services/file_service.py
  • api/db/services/knowledgebase_service.py
  • api/db/services/llm_service.py
  • api/db/services/task_service.py
  • api/db/services/user_service.py
  • common/metadata_utils.py
  • common/query_base.py
  • deepdoc/parser/paddleocr_parser.py
  • memory/services/query.py
  • rag/nlp/query.py
  • rag/nlp/rag_tokenizer.py
  • rag/nlp/search.py
  • rag/nlp/term_weight.py
  • rag/prompts/meta_filter.md
  • rag/raptor.py
  • rag/svr/task_executor.py
  • test/unit_test/common/test_apply_semi_auto_meta_data_filter.py
  • test/unit_test/common/test_metadata_filter_operators.py
  • web/src/components/metadata-filter/index.tsx
  • web/src/components/metadata-filter/metadata-filter-conditions.tsx
  • web/src/components/metadata-filter/metadata-semi-auto-fields.tsx
  • web/src/components/originui/time-range-picker.tsx
  • web/src/components/paddleocr-options-form-field.tsx
  • web/src/components/ui/input-select.tsx
  • web/src/pages/user-setting/setting-model/modal/paddleocr-modal/index.tsx

本文档介绍了驱动 RAGFlow 检索系统的查询处理管线与混合搜索机制。内容涵盖用户查询的预处理、转换为搜索向量、与基于关键词的搜索相结合,以及在文档存储中执行查询的完整流程。

概述

RAGFlow 实现了一种结合以下三种策略的混合搜索方案:

  • 向量搜索:通过 MatchDenseExpr rag/nlp/search.py:61 使用嵌入向量模型进行语义相似度匹配。
  • 全文搜索:通过 MatchTextExpr rag/nlp/query.py:177-179 使用类似 BM25 的算法进行关键词匹配。
  • 融合:使用 FusionExpr rag/nlp/search.py:25 对两种搜索方法进行加权组合。

查询处理流程包括语言检测、多轮对话的查询优化、关键词提取,以及由 rag/nlp/search.py 中的 Dealerrag/nlp/search.py:37-41 管理的自适应搜索策略。

查询预处理管线

在执行搜索之前,用户查询会经过多个预处理步骤,以提高检索质量。

多轮对话的查询优化

当用户进行多轮对话时,RAGFlow 可以选择性地通过引入前几轮对话的上下文来优化查询。rag/nlp/query.py 中的 FulltextQueryer 类处理了将自然语言问题转换为结构化查询表达式的核心逻辑 rag/nlp/query.py:27-40

查询优化流程图

flowchart TD
    UserQuery["用户查询<br/>(最新消息)"]
    CheckMultiTurn["检查对话历史"]
    CheckRefine["prompt_config<br/>refine_multiturn?"]
    FullQuestion["full_question()<br/>基于大语言模型(LLM)的优化<br/>rag/prompts/generator.py"]
    SimpleQuery["直接使用查询"]
    SearchReady["查询已就绪<br/>可进行搜索"]

    UserQuery --> CheckMultiTurn
    CheckMultiTurn --> CheckRefine
    CheckRefine -->|"是"| FullQuestion
    CheckRefine -->|"否"| SimpleQuery
    FullQuestion --> SearchReady
    SimpleQuery --> SearchReady

优化过程通常会使用一个大语言模型(LLM)来重写当前查询。此操作在 DialogService 内部通过 full_question 提示词进行管理 api/db/services/dialog_service.py:51。然后,FulltextQueryer.question 方法会准备包含优化后文本的 MatchTextExpr rag/nlp/query.py:41-94

来源:rag/nlp/query.py:27-94, api/db/services/dialog_service.py:51, rag/nlp/query.py:41-94

跨语言查询处理

RAGFlow 通过检测查询语言并可选地进行翻译来支持跨语言检索。rag_tokenizer 提供了处理繁简体中文转换和全角半角字符规范化的工具 rag/nlp/query.py:53-54

flowchart LR
    Query["用户查询"]
    DetectLang["is_chinese()<br/>rag_tokenizer.py"]
    CheckCrossLang["Dialog<br/>cross_language<br/>已启用?"]
    Translate["cross_languages()<br/>rag/prompts/generator.py"]
    Process["继续<br/>处理"]

    Query --> DetectLang
    DetectLang --> CheckCrossLang
    CheckCrossLang -->|"是"| Translate
    CheckCrossLang -->|"否"| Process
    Translate --> Process

rag/prompts/generator.py 中的 cross_languages 函数由 DialogService 调用,用于规范化问题语言 api/db/services/dialog_service.py:51

来源:rag/nlp/query.py:52-60, api/db/services/dialog_service.py:51, rag/nlp/rag_tokenizer.py:1-20

关键词提取与词项加权

为了增强检索效果,RAGFlow 会提取关键词并分配权重。

  • 词项加权:权重基于词性标注和频率数据计算得出 rag/nlp/query.py:29-30
  • 同义词:通过 synonym.Dealer 查找,并以降低的权重(例如 w/4.0)添加到查询中 rag/nlp/query.py:68-72
  • 提取逻辑FulltextQueryer 会拆分查询并为每个 Token 生成词项权重 rag/nlp/query.py:105-115

来源:rag/nlp/query.py:27-30, rag/nlp/query.py:60-72, rag/nlp/query.py:105-115

混合搜索架构

核心搜索机制通过加权融合策略,将向量相似度与关键词匹配相结合。

搜索组件架构
graph TB
    subgraph "自然语言空间"["自然语言空间"]
        Q["用户问题文本"]
        QTok["tokenize()<br/>rag_tokenizer.py"]
        QKwd["关键词与权重<br/>rag/nlp/query.py"]
    end

    subgraph "表达式"["代码实体空间:表达式"]
        MatchText["MatchTextExpr<br/>BM25 关键词搜索<br/>字段: content_ltks, title_tks"]
        MatchDense["MatchDenseExpr<br/>向量相似度搜索<br/>度量: cosine"]
        FusionExpr["FusionExpr<br/>类型: weighted_sum"]
    end

    subgraph "执行"["代码实体空间:执行"]
        Dealer["Dealer.search()<br/>rag/nlp/search.py"]
        DocStore["DocStoreConnection.search()<br/>common/doc_store/doc_store_base.py"]
    end

    Q --> QTok
    QTok --> QKwd

    QKwd --> MatchText
    MatchText --> FusionExpr
    MatchDense --> FusionExpr

    FusionExpr --> Dealer
    Dealer --> DocStore

来源:rag/nlp/search.py:37-61, rag/nlp/query.py:27-40, rag/nlp/search.py:132-170

向量搜索组件

向量搜索组件使用嵌入向量进行语义匹配。

  • 度量:余弦相似度是标准度量 rag/nlp/search.py:61
  • 列选择:系统会根据维度识别合适的向量列,例如 q_{len}_vec rag/nlp/search.py:60
  • 编码:通过 emb_mdl.encode_queries 调用嵌入向量模型 rag/nlp/search.py:54

来源:rag/nlp/search.py:53-61, api/db/services/llm_service.py:120-134

全文搜索组件

全文搜索针对 FulltextQueryer 中定义的多个字段进行,并带有特定的权重提升 rag/nlp/query.py:31-39

  • title_tks^10
  • important_kwd^30
  • question_tks^20
  • content_ltks^2

来源:rag/nlp/query.py:31-39, rag/nlp/search.py:173-180

融合策略

Dealer 类通过将 MatchTextExprMatchDenseExprFusionExpr 结合来实现混合融合。

  • 融合执行:系统会创建一个 FusionExpr 并将其传递给数据存储的搜索方法 rag/nlp/search.py:175-180

来源:rag/nlp/search.py:25, rag/nlp/search.py:175-180

元数据过滤

RAGFlow 支持在检索过程中进行复杂的元数据过滤。Dealer.get_filters 方法将请求参数映射到数据库字段 rag/nlp/search.py:120-130

参数数据库字段描述
kb_idskb_id知识库标识符
doc_idsdoc_id文档标识符
available_intavailable_int状态过滤器(激活/未激活)
knowledge_graph_kwdknowledge_graph_kwd知识图谱(KG)特定过滤器
entity_kwdentity_kwd实体过滤器

common/metadata_utils.py 中的 apply_meta_data_filter 函数负责处理应用这些规则的逻辑,包括支持“自动”(由大语言模型(LLM)生成)、“半自动”和“手动”模式 common/metadata_utils.py:38

来源:rag/nlp/search.py:120-130, common/metadata_utils.py:38, api/db/services/dialog_service.py:38

搜索执行流程

搜索过程由 Dealer.search 方法编排,该方法负责处理分页、字段选择和结果修剪。

sequenceDiagram
    participant S as DialogService
    participant D as Dealer
    participant DS as 文档存储(ES/Infinity)

    S->>D: search(req, idx_names, kb_ids, emb_mdl)
    D->>D: get_filters(req)

    alt 是关键词搜索
        D->>D: qryr.question(qst)
    else 是混合搜索
        D->>D: get_vector(qst, emb_mdl)
        D->>D: FusionExpr("weighted_sum")
    end

    D->>DS: search(src, highlightFields, filters, matchExprs, ...)
    DS-->>D: 结果 (ids, fields, highlight)

    D->>D: _prune_deleted_chunks(sres)
    D-->>S: SearchResult

来源:rag/nlp/search.py:77-118, rag/nlp/search.py:132-180

RAPTOR 与 GraphRAG 集成

查询处理还与高级检索结构进行交互:

  • RAPTORrag/raptor.py 中的 RecursiveAbstractiveProcessing4TreeOrganizedRetrieval 类为树状组织检索构建摘要层 rag/raptor.py:156-172
  • GraphRAG:系统可以针对知识图谱执行搜索,利用 Dealer 中的 knowledge_graph_kwd 和基于实体的过滤器等字段 rag/nlp/search.py:126-127task_executor.py 负责处理 GRAPH_RAG 任务类型 rag/svr/task_executor.py:125

来源:rag/raptor.py:156-186, rag/svr/task_executor.py:122-128, rag/nlp/search.py:126-127