搜索与发现
相关源文件
本文档解释了 Immich 中的搜索功能、回忆功能以及其他发现机制,这些机制可帮助用户在其媒体库中查找和重新发现照片和视频。
有关相册和共享功能的信息,请参阅相册和共享。有关人物和面部识别的信息,请参阅人物和面部识别。
1. 搜索系统架构
Immich 提供了一个强大的搜索系统,允许用户根据各种条件查找资产。该系统由与后端 API 交互的前端组件组成,以提供全面的搜索功能。
搜索系统组件
来源
- web/src/lib/components/shared-components/search-bar/search-bar.svelte
- web/src/lib/components/shared-components/search-bar/search-history-box.svelte
- web/src/lib/stores/search.svelte.ts
- web/src/routes/(user)/search/[[photos=photos]]/[[assetId=id]]/+page.svelte
2. 搜索类型和功能
Immich 支持三种不同的搜索方法,每种方法都服务于不同的用户需求
| 搜索类型 | 实现 | 描述 | 用途 |
|---|
| 智能搜索(上下文) | 通过 pgvecto.rs 使用 CLIP 模型 | 理解图像内容的语义搜索 | 查找包含“日落”、“山脉”等的照片 |
| 元数据搜索 | 对资产元数据进行 SQL 查询 | 搜索原始文件名 | 按文件名查找照片 |
| 描述搜索 | 对资产描述进行 SQL 查询 | 搜索用户添加的描述 | 按文本描述查找照片 |
搜索类型可以在搜索界面中选择,默认是智能搜索。搜索类型存储在浏览器的 localStorage 中,并通过 getSearchType() 函数在 web/src/lib/components/shared-components/search-bar/search-bar.svelte162-178 中检索。
搜索过程流程
来源
- web/src/lib/components/shared-components/search-bar/search-bar.svelte
- web/src/routes/(user)/search/[[photos=photos]]/[[assetId=id]]/+page.svelte
3. 高级搜索筛选器
用户可以使用通过搜索筛选器模态框访问的强大筛选器集执行高级搜索。SearchFilterModal 组件提供了构建复杂查询的用户界面。
高级搜索筛选器包括
- 日期范围(拍摄时间早于/晚于)
- 位置信息(城市、国家/地区、州)
- 相机详情(品牌、型号、镜头型号)
- 人物(通过面部识别)
- 用户自定义标签
- 资产属性(收藏、已归档、不在相册中)
- 媒体类型(照片 vs. 视频)
搜索页面在结果顶部以“芯片”形式显示活动筛选器,清楚地表明当前搜索结果应用的参数。
来源
- web/src/routes/(user)/search/[[photos=photos]]/[[assetId=id]]/+page.svelte
- web/src/lib/components/shared-components/search-bar/search-bar.svelte
4. 搜索历史
Immich 维护最近搜索的历史记录以改善用户体验。该历史记录由 searchStore 管理,它提供以下功能
当搜索输入框获得焦点时,搜索历史记录会显示在搜索栏下方的下拉菜单中,允许用户快速重复使用以前的搜索。最多存储 5 条最近的搜索记录,最新记录位于顶部。
来源
- web/src/lib/stores/search.svelte.ts
- web/src/lib/components/shared-components/search-bar/search-history-box.svelte
- web/src/lib/components/shared-components/search-bar/search-bar.svelte
5. 回忆功能
回忆功能自动重新展示过去的照片和视频,并根据时间段、地点或事件组织成主题合集。
内存系统架构
来源
- web/src/lib/components/memory-page/memory-viewer.svelte
- web/src/lib/components/photos-page/memory-lane.svelte
- web/src/lib/stores/memory.store.svelte.ts
5.1 回忆长廊
回忆长廊组件在照片页面上显示一个水平滚动的回忆预览部分。每个回忆预览都会显示该回忆的代表性图像以及标题。
回忆长廊的主要功能
- 带有左右按钮的水平滚动导航
- 每个回忆的可视预览卡片
- 显示回忆上下文的标题(例如,“2 年前”)
- 点击导航到完整的回忆查看器
该组件通过调用 memoryStore.initialize() 进行初始化,该函数通过 searchMemories API 获取回忆。
来源
- web/src/lib/components/photos-page/memory-lane.svelte
5.2 回忆查看器
回忆查看器提供身临其境的回忆查看体验,具有以下功能
- 带有播放/暂停控制的回忆资产幻灯片查看
- 指示回忆中当前位置的进度条
- 资产和回忆之间的上一张/下一张导航
- 相邻回忆的视觉指示器
- 收藏、删除或修改回忆的选项
- 屏幕底部显示回忆中所有资产的画廊视图
回忆查看器使用 Tween 动画控制器来处理幻灯片播放的时序和进度,以适当的速度自动播放照片和视频。
来源
- web/src/lib/components/memory-page/memory-viewer.svelte
6. 重复项检测
Immich 提供了工具来识别和管理媒体库中的重复资产,帮助用户维护有序的收藏。
重复项管理流程
来源
- web/src/routes/(user)/utilities/duplicates/[[photos=photos]]/[[assetId=id]]/+page.svelte
- web/src/lib/components/utilities-page/duplicates/duplicates-compare-control.svelte
- web/src/lib/components/utilities-page/duplicates/duplicate-asset.svelte
6.1 重复项识别逻辑
Immich 的重复项检测算法侧重于查找内容和特征相似的资产。系统会识别潜在的重复项并将其分组以供用户审核。
找到重复项后,Immich 使用 suggestDuplicate() 函数建议保留哪个版本,该函数按顺序应用以下标准
- 优先选择文件大小最大的资产
- 如果多个资产文件大小相同,则优先选择 EXIF 元数据最多的资产
来源
- web/src/lib/utils/duplicate-utils.ts
- web/src/lib/utils/exif-utils.ts
6.2 重复项管理界面
重复项管理界面提供了处理重复项的多种工具
- 重复资产的并排比较
- 显示哪些资产被选中保留或删除的视觉指示器
- 选择全部或不选择重复项的选项
- 能够将重复项堆叠成单个资产堆栈
- 用于高效处理多个重复组的批量操作
常用重复项管理操作提供键盘快捷键
a - 选择所有重复项
s - 查看资产
d - 取消选择所有重复项
Shift+c - 解决重复项
Shift+s - 堆叠重复项
来源
- web/src/lib/components/utilities-page/duplicates/duplicates-compare-control.svelte
- web/src/routes/(user)/utilities/duplicates/[[photos=photos]]/[[assetId=id]]/+page.svelte
7. 资产标记
标签为用户提供了一种手动组织和发现其内容的方式。Immich 中的标签系统允许用户为任何资产添加自定义标签,然后通过这些标签搜索资产。
标记流程
- 用户可以通过
TagAssetForm 组件为资产添加标签
- 标签可以从现有标签中选择或即时创建
- 标签存储在数据库中并与资产关联
- 带有标签的资产可以通过包含标签选择的搜索筛选器找到
该 TagAssetForm 组件提供了管理资产标签的界面
来源
- web/src/lib/components/forms/tag-asset-form.svelte
8. 与其他功能的集成
搜索和发现功能与 Immich 的其他组件深度集成
-
相册集成:
-
人物集成:
- 搜索包含特定人物的资产
- 搜索筛选器中的人物“芯片”
-
地图视图集成:
- 按位置搜索(城市、国家/地区、州)
- 基于位置的回忆
-
资源组织:
搜索结果页面提供对所有匹配内容的统一访问
来源
- web/src/routes/(user)/search/[[photos=photos]]/[[assetId=id]]/+page.svelte
总结
Immich 中的搜索和发现系统为用户提供了强大的工具来查找和重新发现其媒体。从智能语义搜索到自动化回忆和重复项检测,这些功能协同工作,共同打造全面的照片管理体验。
该架构利用矢量搜索等现代技术实现智能内容理解,同时还提供传统的基于元数据的搜索选项。用户界面组件设计直观且响应迅速,并特别注重状态管理和性能。