检索系统
搜索系统
相关源文件
本章引用的主要源码文件:
docs/releases/4.1.9.txtmayan/apps/cabinets/tests/test_widgets.pymayan/apps/databases/literals.pymayan/apps/dynamic_search/api_views.pymayan/apps/dynamic_search/backends/django.pymayan/apps/dynamic_search/backends/whoosh.pymayan/apps/dynamic_search/classes.pymayan/apps/dynamic_search/filters.pymayan/apps/dynamic_search/literals.pymayan/apps/dynamic_search/management/commands/search_index_objects.pymayan/apps/dynamic_search/queues.pymayan/apps/dynamic_search/serializers.pymayan/apps/dynamic_search/tasks.pymayan/apps/dynamic_search/templates/dynamic_search/app/list_toolbar.htmlmayan/apps/dynamic_search/templates/dynamic_search/search_box.htmlmayan/apps/dynamic_search/tests/backends.pymayan/apps/dynamic_search/tests/mixins.pymayan/apps/dynamic_search/tests/test_backends.pymayan/apps/dynamic_search/tests/test_classes.pymayan/apps/dynamic_search/tests/test_tasks.pymayan/apps/dynamic_search/tests/test_views.pymayan/apps/dynamic_search/urls.pymayan/apps/dynamic_search/utils.pymayan/apps/dynamic_search/view_mixins.pymayan/apps/dynamic_search/views.pymayan/apps/metadata/tests/test_widgets.pymayan/apps/tags/tests/test_widgets.py
目的与范围
搜索系统为 Mayan EDMS 提供动态搜索能力,使用户能够通过多种搜索后端查找文档、元数据、标签及其他内容。该系统支持简单搜索和高级搜索界面、自动内容索引以及可插拔的后端实现,包括 Whoosh、ElasticSearch 和 Django ORM。
关于文档组织功能,请参见文档组织。关于访问控制集成,请参见访问控制与权限。
架构总览
搜索系统采用可插拔的后端架构,具备自动索引和多种界面选项:
来源:mayan/apps/dynamic_search/classes.py:38-508, mayan/apps/dynamic_search/views.py:32-179, mayan/apps/dynamic_search/api_views.py:13-103
核心组件
SearchBackend 类
SearchBackend 类为所有搜索实现提供抽象接口:
后端系统通过 setting_backend 配置支持可插拔实现,默认使用 Whoosh。
来源:mayan/apps/dynamic_search/classes.py:38-508, mayan/apps/dynamic_search/backends/whoosh.py:28-292, mayan/apps/dynamic_search/backends/django.py:15-243
SearchModel 注册
SearchModel 实例定义哪些 Django 模型可搜索,并配置其搜索字段:
搜索模型通过 AppsModuleLoaderMixin 从每个应用的 search.py 模块自动加载。
来源:mayan/apps/dynamic_search/classes.py:564-862
SearchField 类型
搜索字段支持直接模型字段和通过外键关联的字段:
| 字段类型 | 语法 | 示例 |
|---|---|---|
| 直接字段 | field_name | label, description |
| 外键字段 | fk__field | document_type__label |
| 反向外键 | related__field | files__filename |
| 多对多 | m2m__field | tags__label |
| 深层关系 | fk__fk__field | document__document_type__label |
来源:mayan/apps/dynamic_search/classes.py:510-563
搜索后端实现
Whoosh 后端
Whoosh 后端提供基于文件的全文搜索索引:
Whoosh 使用基于文件的索引,默认存储在 MEDIA_ROOT/whoosh_index/ 中,并通过锁定机制支持并发访问。
来源:mayan/apps/dynamic_search/backends/whoosh.py:28-292
Django 后端
Django 后端使用原生 ORM 查询进行搜索,无需外部依赖:
Django 后端支持高级查询语法,包括引号字符串、否定词项和布尔运算符。
来源:mayan/apps/dynamic_search/backends/django.py:15-243
索引系统
自动索引
搜索系统通过 Django 信号自动维护索引:
信号处理器通过 SearchBackend._enable() 和 SearchBackend._disable() 自动连接/断开。
来源:mayan/apps/dynamic_search/classes.py:85-146, mayan/apps/dynamic_search/tasks.py:22-166
索引任务
搜索索引使用 Celery 任务进行异步处理:
| 任务 | 用途 | 队列 |
|---|---|---|
task_index_instance | 索引单个模型实例 | queue_search |
task_deindex_instance | 从索引中移除实例 | queue_search |
task_index_instances | 批量索引多个实例 | queue_search |
task_reindex_backend | 全部内容重新索引 | queue_search_slow |
task_index_related_instance_m2m | 处理多对多关系变更 | queue_search |
任务包含指数退避重试逻辑,用于处理临时故障。
来源:mayan/apps/dynamic_search/tasks.py:22-166, mayan/apps/dynamic_search/queues.py:6-42
查询处理
查询语法
搜索系统支持带有作用域搜索的高级查询语法:
查询语法支持作用域标记(__)、运算符(__operator_)和结果选择(__result)。
来源:mayan/apps/dynamic_search/classes.py:261-331
权限集成
搜索结果通过 ACL 权限进行过滤:
每个 SearchModel 可以指定所需的权限,结果会通过 ACL 系统进行过滤。
来源:mayan/apps/dynamic_search/classes.py:438-444
Web 界面
搜索视图
Web 界面提供简单搜索和高级搜索两种表单:
视图使用 SearchModelViewMixin 从 URL 参数中解析搜索模型。
来源:mayan/apps/dynamic_search/views.py:32-179, mayan/apps/dynamic_search/view_mixins.py:90-114
列表过滤
搜索系统通过 SearchEnabledListViewMixin 提供自动列表过滤:
这使任何包含该混入类的列表视图都能启用搜索过滤。
来源:mayan/apps/dynamic_search/view_mixins.py:12-88
REST 接口
API 视图
REST API 提供程序化搜索访问:
API 视图根据搜索模型配置动态设置序列化器类。
来源:mayan/apps/dynamic_search/api_views.py:13-103
REST 接口过滤
RESTAPISearchFilter 在任何 API 端点上启用搜索过滤:
该过滤器会自动应用于未禁用搜索过滤的 API 视图。
来源:mayan/apps/dynamic_search/filters.py:16-82
配置
设置
搜索系统通过 Django 设置进行配置:
| 设置项 | 默认值 | 用途 |
|---|---|---|
SEARCH_BACKEND | WhooshSearchBackend | 后端实现 |
SEARCH_BACKEND_ARGUMENTS | {} | 后端特定选项 |
SEARCH_RESULTS_LIMIT | 100 | 返回的最大结果数 |
SEARCH_INDEXING_CHUNK_SIZE | 25 | 索引的批量大小 |
SEARCH_DISABLE_SIMPLE_SEARCH | False | 隐藏简单搜索界面 |
后端参数用于配置特定实现(例如,Whoosh 索引路径、ElasticSearch 连接)。
来源:mayan/apps/dynamic_search/literals.py:3-48
管理命令
系统提供用于维护的管理命令:
# 索引特定对象范围
./manage.py search_index_objects <model_name> <id_range>
# 完整后端重新索引(通过任务)
# 通过 SearchBackendReindexView 触发
重新索引过程会清除现有索引,并根据当前数据库状态重建索引。
来源:mayan/apps/dynamic_search/management/commands/search_index_objects.py:9-55