文档引擎选择
文档引擎选择
相关源文件
本章引用的主要源码文件:
.github/workflows/release.yml.github/workflows/tests.ymlDockerfileDockerfile.depsapi/db/joint_services/memory_message_service.pyapi/db/joint_services/user_account_service.pyapi/db/services/doc_metadata_service.pycommon/doc_store/es_conn_base.pycommon/doc_store/infinity_conn_base.pycommon/doc_store/ob_conn_base.pycommon/doc_store/ob_conn_pool.pycommon/settings.pyconf/infinity_mapping.jsonconf/mapping.jsondocker/docker-compose-base.ymldocker/infinity_conf.tomldownload_deps.pyhelm/values.yamlmemory/services/messages.pymemory/utils/aggregation_utils.pymemory/utils/es_conn.pymemory/utils/highlight_utils.pymemory/utils/infinity_conn.pymemory/utils/ob_conn.pypyproject.tomlrag/utils/es_conn.pyrag/utils/infinity_conn.pyrag/utils/ob_conn.pyrag/utils/opensearch_conn.pysdk/python/pyproject.tomlsdk/python/uv.locktest/unit_test/memory/utils/test_ob_conn_aggregation.pytest/unit_test/memory/utils/test_ob_conn_highlight.pytest/unit_test/rag/utils/test_opensearch_doc_meta.pyuv.lock
本文档提供了关于如何选择、配置和理解 RAGFlow 所支持的文档引擎的技术指南。文档引擎是 RAGFlow 检索能力的核心,提供了混合搜索(全文搜索 + 向量搜索)和元数据过滤功能。
概述
RAGFlow 通过一个统一接口抽象了文档存储,从而支持多种后端引擎。引擎的选择会影响搜索性能、硬件兼容性(x86 与 ARM)以及资源利用率。引擎的选择主要通过 DOC_ENGINE 环境变量控制,该变量会影响基础设施(Docker Compose 配置文件)和应用逻辑。
数据流与架构
文档引擎位于入库管线(任务执行器)和检索管线(RAGFlow 服务器)之间。
引擎集成图:
来源:helm/values.yaml:13-21,rag/utils/es_conn.py:61-62,rag/utils/infinity_conn.py:29-30,common/doc_store/doc_store_base.py:25-26
支持的引擎及其权衡
| 引擎 | DOC_ENGINE 值 | 适用场景 | 架构 | 状态 |
|---|---|---|---|---|
| Elasticsearch | elasticsearch | 生产环境稳定性,广泛兼容性 | x86_64, ARM64 | 默认 |
| Infinity | infinity | 高性能检索增强生成(RAG),低延迟 | x86_64 | 优化 |
| OpenSearch | opensearch | 兼容 AWS 的部署 | x86_64, ARM64 | 支持 |
| OceanBase | oceanbase | 大规模分布式存储 | x86_64, ARM64 | 支持 |
| SeekDB | seekdb | 专用的 OceanBase 衍生版本 | x86_64 | 支持 |
来源:helm/values.yaml:13-21,docker/docker-compose-base.yml:1-100
1. Elasticsearch
Elasticsearch 是 RAGFlow 的主要搜索引擎。它使用 ESConnection 类与集群进行交互。
- 实现:继承自
ESConnectionBase并实现了单例模式rag/utils/es_conn.py:61-62。 - 搜索逻辑:通过组合
MatchTextExpr(BM25)和MatchDenseExpr(向量)来实现混合搜索rag/utils/es_conn.py:25-25。 - 分页:使用
_search_with_search_after机制来处理超出MAX_RESULT_WINDOW(10,000 条命中结果)的深度分页,通过每次迭代 1,000 条记录的方式进行rag/utils/es_conn.py:31-32,rag/utils/es_conn.py:76-140。 - 原子更新:通过专用脚本
_PAGERANK_FEA_ADJUST_SCRIPT支持对片段反馈的 PageRank 特征进行调整rag/utils/es_conn.py:36-58。
来源:rag/utils/es_conn.py:61-140,docker/docker-compose-base.yml:2-34
2. Infinity
Infinity 是专为检索增强生成(RAG)设计的引擎,针对稠密和稀疏向量检索进行了优化。它由 InfiniFlow 开发,并针对 RAGFlow 的工作负载进行了高度优化。
- 优化:专门处理 RAG 特定字段,如
docnm_kwd、title_tks和important_kwd,将它们映射到专用的全文索引(例如ft_content_rag_coarse)rag/utils/infinity_conn.py:62-88。 - 字段转换:将应用层字段映射到内部存储字段。例如,
important_kwd在输出字段中被转换为important_keywordsrag/utils/infinity_conn.py:44-59。 - 表管理:对于片段表,它会从标准查询中移除
kb_id过滤器,因为它利用每个知识库一个表(例如{indexName}_{kb_id})的分离方式来优化查询性能rag/utils/infinity_conn.py:155-165。 - 数据映射:模式在
conf/infinity_mapping.json中定义,支持专用类型如varchar,并带有多种分析器(rag-coarse、rag-fine),以及针对低基数(low-cardinality)字段(如kb_id)的二级索引conf/infinity_mapping.json:1-43。
来源:rag/utils/infinity_conn.py:29-165,docker/docker-compose-base.yml:72-97,conf/infinity_mapping.json:1-43
3. OpenSearch
OpenSearch 作为 Elasticsearch 的社区驱动替代方案得到支持,特别适用于 AWS 环境。
- 配置:在 Docker 环境中默认暴露在
9201端口docker/docker-compose-base.yml:43-43。 - 部署:使用
opensearchproject/opensearch:2.19.1镜像,并需要特定的安全插件配置docker/docker-compose-base.yml:36-70。
来源:docker/docker-compose-base.yml:36-70,helm/values.yaml:166-191
4. OceanBase 和 SeekDB
OceanBase 提供了一种具有向量搜索能力的分布式关系数据库方法。SeekDB 是用于类似用例的专用版本。
- 配置:OceanBase 使用端口
2881docker/docker-compose-base.yml:108-108。SeekDB 也使用端口2881,并支持特定的内存限制docker/docker-compose-base.yml:132-136。 - 实现:使用
OBConnection,它定义了一个全面的片段表模式,包括用于内容的LONGTEXT类型和用于位置数据的ARRAY类型rag/utils/ob_conn.py:52-99。 - 搜索能力:同时支持原始内容全文搜索(
FTS_COLUMNS_ORIGIN)和分词后内容全文搜索(FTS_COLUMNS_TKS)rag/utils/ob_conn.py:116-131。
来源:docker/docker-compose-base.yml:99-146,rag/utils/ob_conn.py:52-131
技术配置
通过部署选择引擎
切换引擎的主要方式是修改 docker/.env 文件或 Helm 的 values.yaml 中的 DOC_ENGINE 变量。
在 Helm 中: values.yaml 中的 DOC_ENGINE 值默认为 infinity,但可以切换为 elasticsearch 或 opensearch helm/values.yaml:13-21。
搜索操作数据流(以 Infinity 为例)
下面的时序图连接了“自然语言空间”(搜索请求)和“代码实体空间”(内部类和函数)。
来源:rag/utils/infinity_conn.py:94-125,rag/utils/infinity_conn.py:155-173,common/doc_store/ob_conn_pool.py:1-20
存储依赖
文档引擎与部署环境中定义的其他存储系统协同工作:
- MySQL:存储结构化元数据和应用状态。默认端口
3306docker/docker-compose-base.yml:191-191。 - MinIO:用于原始文档和解析后图片的对象存储。默认 API 端口
9000docker/docker-compose-base.yml:208-208。 - Redis (Valkey):管理任务队列和任务流。默认端口
6379docker/docker-compose-base.yml:230-230。
来源:docker/docker-compose-base.yml:176-247,helm/values.yaml:193-246