# UKUI 智能数据管理

## 介绍

UKUI 智能数据管理（ukui-idm）是一个对本地文件进行按条件管理的项目，和传统的文件管理器以目录管理文件的方式不同，ukui-idm允许用户在自定义视图中管理感兴趣的文件。

我们把上述自定义的视图称为“智能空间”，和平常的目录不同，智能空间可能包含来自不同目录的文件，这取决于用户定义的条件。用户可以自行创建智能空间，已经创建的智能空间也支持进行条件编辑。

每一个用户拥有两个默认空间，“工作”和“下载”，“工作”空间将找到计算机中属于用户的文档并且将它们列在一起，而“下载”空间会收集用户从浏览器、网盘、聊天工具或者其它应用下载下来的文件。

## 智能空间数据管理机制说明

不像tracker、ukui-search这一类搜索相关的索引管理机制，智能数据空间管理并不为所有文件建立索引，而是把关注点放在用户感兴趣的一类文件。对于每一个空间，用户看到的所有文件就是该空间下所有的数据记录。

智能空间数据基于sqlite数据库进行数据管理，对每一个创建的空间，数据库都会为此空间建立一个表格，这个表格中记录了空间中文件的路径，元数据（比如缩略图路径、作者、发行日期等），是否手动添加，元数据最后更新的时间，以及版本管理相关信息。

对于当前创建的空间也有一个总表，用于空间的名称和条件进行管理，考虑到可能会在外部对空间条件进行修改，每个空间的条件会以单独的配置文件的形式储存，对于配置文件也会有一个最后更新时间用于校验配置准确性。

复制空间时，会把当前空间的表格拷贝到新空间，对应的配置文件也一起拷贝。

对于空间条件的改变，根据不同场景可能实际的处理方式不同，如果是在现有条件上新增条件，或者修改新增条件，都是基于原有空间的数据生成子表，这样可以避免大量操作。

由于ukui下的ukui-search已经实现了一整套索引机制，考虑到代码和资源复用，智能空间在创建空间和响应空间内文件改变以及新文件会使用现有ukui-search的机制（如果存在目前无法复用的情况则考虑在ukui-search提供接口，或者sdk提供接口）。

## 内容和标签筛选

和上述数据管理机制不同，内容和标签筛选属于NLP范畴，基于麒麟AI组件提供的相关接口和向量数据库进行匹配筛选，考虑到标签和内容搜索可能存在误差，对于默认的两个空间，除了标签筛选之外，还内置了隐藏条件，比如docx、pdf、txt这类文件会强制被认为是具有文档属性的文件。

除了文档类型，图片、视频、音频、压缩文件、安装包等这类具有明确类型指向的文件标签都会内置隐含条件，确保筛选时的准确性。

## 预览

预览使用轻量级的解决方案。

大部分文件的缩略图的生成依赖于ukui-file-metadata框架
对于office文档，ukui-file-metadata生成缩略图的效果并不好，可能需要迁移calligra或者goffice的渲染机制生成office文档的缩略图。

后续希望能够实现可交互的预览图，比如框选复制预览界面的内容。

## 版本控制

当前版本控制基于本地方案实现，由于每一个文件的路径是唯一的，一般本地实现版本控制只能通过git等版本管理工具实现，考虑到git等版本管理工具需要以目录为根进行版本管理，ukui-idm会将文件的路径进行hash编码，然后在~/.local/share/目录或者文件所在挂载点根目录的隐藏文件下创建对应的git目录，当用户保存编辑的文件时，这个最新的文件会被提交到对应的git仓库，当用户切换到旧版本时，会从git仓库中以只读方式打开旧版本的文件。

考虑到office文档类型使用git进行版本管理可能会比较浪费计算机磁盘空间，后续可能还是要切换到开源网盘或者在线协同工具方案。
## 搜索

搜索功能和ukui-search逻辑基本保持一致，不同点在于智能空间内部的搜索，和语义搜索，智能空间内部的搜索实际上是将所有智能空间内的文件进行按名称筛选，语义搜索和创建空间的行为类似，并且可以添加为新的空间。

语义搜索会将文本描述通过ai接口转化为ukui-idm的条件项，进而按条件项进行搜索。

## 条件

条件是空间中文件属性的一组可量化的信息描述，举例来说，我们在文件管理器搜索时，可以添加一些筛选项，比如类型、文件大小、修改时间之类的条件，智能数据管理在创建时和使用中可以动态的修改这些条件，然后更新空间中的数据，同时，对于符合条件的新文件，智能数据管理也会设法将其纳入此空间，故可以将空间理解为一个动态的搜索过程，这也是智能数据管理区别与传统文件管理和搜索的一个重要特征。

## 麒思助手（待定）

麒思助手会根据不同文件类型提供不同的智能处理功能，比如文本类型文件可以生成内容摘要，图片可以识别图片内容或者文字，视频文件可以导出字幕，音频文件可以转文字等等。

