【Ragflow】16.Ragflow-Plus管理系统开发日志:重塑文件管理单元

概述

ragflow 有个文件管理菜单,但是每个用户只能看到自己上传的文件,看不到其它用户上传,这显然会对管理造成阻碍。

此外,ragflow 存在三个文件上传方式:

  • 1.从文件管理菜单中上传
  • 2.从知识库中上传
  • 3.直接从聊天对话中上传

并且,在minio存储桶中,对于单次上传的所有文件会存在同一个桶中,比如,上传一个文件夹,会新建一个桶存放所有文件夹中的文件;再上传一个单独文件,又会新建一个桶存放新的文件。

这样设计是非常糟糕的,客观上造成了维护和二次开发的难度。

因此,ragflow-plus 打算另起炉灶,重新开发文件管理系统,主要特点是:

  • 1.所有文件原子化,不再分文件夹,上传所有文件都会单独建一个桶进行存储,每个桶除了存放上传的原始文件之外,后续的桶里会存放其解析的chunk,一个文件一个桶,比较清晰,利于维护。

  • 2.在管理系统中,管理员可以查看数据库中所有文件,支持下载、查询和删除。

  • 3.统一文件上传入口,在管理系统中,新增文件上传入口,该文件上传入口并不会对文件大小进行限制,后续将在使用系统中,限制用户直接上传文件,文件管理权限将完全赋予管理员。

效果如下:

目前,当前新增功能已更新至仓库,docker部署用户可再等待后续知识库管理单元开发完善后,再下载新版镜像进行更新。

ragflow-plus地址:
https://github.com/zstar1003/ragflow-plus

数据库文件管理相关表

在mysql数据库中,和文件管理相关的表总共有三张:filedocumentfile2document

file 表字段含义

file 表用于存储和管理系统中的文件信息,包括文件的基本属性、存储位置和所有权等。系统会根据这些信息对文件进行组织、展示和权限控制。

字段名 数据类型 含义 默认值
id CharField(32) 文件的唯一标识符,主键 UUID生成
create_time IntegerField 文件创建的时间戳 当前时间戳
create_date CharField 文件创建的日期,格式为YYYY-MM-DD 当前日期
update_time IntegerField 文件最后更新的时间戳 当前时间戳
update_date CharField 文件最后更新的日期,格式为YYYY-MM-DD 当前日期
parent_id CharField(32) 父文件夹ID,用于构建文件层次结构 -
tenant_id CharField(32) 租户ID,表示文件所属的用户或组织 -
created_by CharField(32) 创建者ID,表示谁创建了该文件 -
name CharField(255) 文件名称 -
location CharField(255) 文件存储位置,如MinIO中的路径 -
size IntegerField 文件大小,单位为字节 0
type CharField(32) 文件类型,如folder、pdf、word等,对应FileType枚举 -
source_type CharField(32) 文件来源类型,如本地、知识库、S3等,对应FileSource枚举 “” (LOCAL)

file 表与其他表的关系:

  • 通过 parent_id 构建文件夹层次结构
  • 通过 file2document 表与文档表建立多对多关系

document 表字段含义

document 表用于存储和知识库中的文档信息。

字段名 数据类型 含义 默认值
id CharField(32) 文档的唯一标识符,主键 UUID生成
create_time IntegerField 文档创建的时间戳 当前时间戳
create_date CharField 文档创建的日期,格式为YYYY-MM-DD 当前日期
update_time IntegerField 文档最后更新的时间戳 当前时间戳
update_date CharField 文档最后更新的日期,格式为YYYY-MM-DD 当前日期
thumbnail TextField 文档缩略图的base64字符串 null
kb_id CharField(256) 知识库ID,表示文档所属的知识库 -
parser_id CharField(32) 解析器ID,用于指定使用哪种解析器处理文档 “”
parser_config JSONField 解析器配置,包含页面范围等参数 {“pages”: [[1, 1000000]]}
source_type CharField(128) 文档来源类型,如本地、S3等 “local”
type CharField(32) 文件类型/扩展名,如pdf、word等 -
created_by CharField(32) 创建者ID,表示谁创建了该文档 -
name CharField(255) 文件名称 null
location CharField(255) 文件存储位置 null
size IntegerField 文件大小,单位为字节 0
token_num IntegerField 文档中的token数量 0
chunk_num IntegerField 文档被分割成的chunk数量 0
progress FloatField 文档处理进度

file2document 表字段含义

file2document 表用于存储文件与文档之间的关联关系。

字段名 数据类型 含义 默认值
id CharField(32) 关联记录的唯一标识符,主键 UUID生成
create_time IntegerField 关联记录创建的时间戳 当前时间戳
create_date CharField 关联记录创建的日期,格式为YYYY-MM-DD 当前日期
update_time IntegerField 关联记录最后更新的时间戳 当前时间戳
update_date CharField 关联记录最后更新的日期,格式为YYYY-MM-DD 当前日期
file_id CharField(32) 文件ID,关联到File表的id字段 -
document_id CharField(32) 文档ID,关联到Document表的id字段 -

file2document 表是一个关联表,用于建立 file 表和 document 表之间的多对多关系:

  • 通过 file_id 关联到 file 表
  • 通过 document_id 关联到 document 表

桶处理脚本

由于 ragflow 的权限限制,用户并不能看到其它用户上传的文件。
因此,使用管理系统删除用户之后,原先用户上传的文件会残留在 minio 之中,浪费存储空间。

因此,编写如下脚本(对应仓库文件cleanup_minio_buckets.py),对无用桶进行清理:

import os
from dotenv import load_dotenv
import mysql.connector
from minio import Minio

# 加载环境变量
load_dotenv("../../docker/.env")

# 数据库连接配置
DB_CONFIG = {
   
    "host": "localhost",
    "port": int(os.getenv("MYSQL_PORT", "5455")),
    "user": "root",
    "password": os.getenv("MYSQL_PASSWORD", "infini_rag_flow"),
    "database": "rag_flow"
}

# MinIO连接配置
MINIO_CONFIG = {
   
    "endpoint": "localhost:" + os.getenv("MINIO_PORT", "9000"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zstar-_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值