Lazy loaded image
obsidian插件:yuhanbo--search,自定义加权的内容搜索插件
00 分钟
2025-5-28
2025-5-28
type
status
date
slug
summary
tags
category
icon
password
本文档旨在为具有一定技术背景的读者提供对 Obsidian 自定义加权搜索插件的全面解析。该插件为 Obsidian 笔记软件开发,允许用户根据文件名、目录、标签、标题级别等元素进行加权搜索,从而更精确地控制搜索结果的排序。本文将详细介绍插件的功能、结构、算法、使用方法以及潜在的改进方向。

插件功能与特性

  1. 多元素加权搜索:该插件支持根据多种元素(文件名、目录、标签、标题级别、正文内容和引用内容)进行加权搜索。
  1. 自定义权重:用户可以自定义每个搜索元素的权重,从而精确控制搜索结果的排序,满足个性化需求。
  1. 即时搜索:插件支持输入两个字符后自动搜索,结果实时显示,提高搜索效率。
  1. 排除文件夹:用户可以设定要排除的文件夹列表,减少搜索范围,提高搜索效率。
  1. 快捷键支持:插件支持使用 Ctrl+Shift+F 快速打开搜索界面,方便用户使用。
notion image

插件结构与组织方式

该插件主要由以下几个文件组成:
  • main.js:插件的核心逻辑实现,包括插件的加载、卸载、设置、索引构建和搜索算法等。
  • styles.css:插件的样式文件,定义了插件界面的各种样式,包括搜索框、按钮、结果列表等。
  • manifest.json:插件的清单文件,包含了插件的元数据信息,如插件 ID、名称、版本、描述、作者等。
  • data.json:存储插件配置数据的文件,包括文件名权重、目录权重、标签权重、各级标题权重、正文内容权重、引用权重、排除的文件夹列表和缓存更新间隔等。
  • versions.json: 定义插件版本和最低兼容 Obsidian 版本的文件。
  • package.json: 定义项目依赖、名称、版本等信息的标准 npm 包文件。
notion image

核心代码解析

main.js

main.js 是插件的核心文件,包含了插件的主要逻辑。
onload 函数:
  • 插件加载时执行,用于初始化插件。
  • 加载插件设置,添加左侧栏图标,添加状态栏项目,添加命令,添加设置选项卡,注册定期更新索引的计时器,初始化索引。
updateSearchIndex 函数:
  • 更新搜索索引,该函数是插件的核心之一。
  • 首先,清空现有的搜索索引,然后获取所有 Markdown 文件。
  • 遍历所有文件,检查文件是否在排除的文件夹中。
  • 如果文件不在排除的文件夹中,则读取文件内容,并提取文件名、目录、标签、标题和引用等信息,然后将这些信息添加到搜索索引中。
search 函数:
  • 执行搜索,该函数是插件的另一个核心。
  • 首先,将查询字符串转换为小写,并按空格分割成关键词数组。
  • 然后,遍历搜索索引中的所有文件,计算每个文件的得分。
  • 计算得分时,根据用户设置的权重,对文件名、目录、标签、标题和引用等元素进行加权计算。
  • 最后,根据得分对搜索结果进行排序,并返回排序后的结果。
其他函数:
  • onunload 函数:插件卸载时执行,用于清理插件。
  • loadSettings 函数:加载插件设置。
  • saveSettings 函数:保存插件设置。
  • getAllTags 函数:获取所有标签。
  • extractHeadings 函数:提取标题信息。
  • extractQuotes 函数:提取引用信息。

styles.css

styles.css 文件定义了插件界面的各种样式,包括搜索框、按钮、结果列表等。
该文件包含了大量的 CSS 规则,用于定义插件界面的各种样式。例如,.yuhanbo-search-modal 类定义了搜索模态框的样式,.search-input 类定义了搜索输入框的样式,.result-item 类定义了搜索结果项的样式等。

manifest.json

manifest.json 文件包含了插件的元数据信息,例如插件 ID、名称、版本、描述、作者等。
该文件用于告诉 Obsidian 如何加载和显示插件。

搜索算法详解

该插件的核心搜索算法位于 main.js 文件的 search 函数中。该算法的主要步骤如下:
  1. 关键词提取:将查询字符串转换为小写,并按空格分割成关键词数组。
  1. 文件遍历:遍历搜索索引中的所有文件。
  1. 得分计算:对于每个文件,根据用户设置的权重,对文件名、目录、标签、标题和引用等元素进行加权计算,得到该文件的得分。
  1. 结果排序:根据得分对搜索结果进行排序,并返回排序后的结果。
在得分计算过程中,该算法使用了简单的字符串匹配算法,例如 indexOfincludes 函数。对于每个关键词,如果文件中的某个元素包含该关键词,则该文件将获得一定的分数。分数的多少取决于用户设置的权重。

潜在限制与改进建议

  1. 索引构建效率:当前的索引构建算法在处理大型笔记库时可能效率较低。可以考虑使用更高效的索引结构,例如倒排索引,以提高索引构建速度。
  1. 搜索算法优化:当前的搜索算法使用了简单的字符串匹配算法,可以考虑使用更高级的搜索算法,例如模糊搜索、拼写纠错等,以提高搜索准确率。
  1. 界面优化:当前的搜索界面可以进一步优化,例如添加搜索历史、搜索建议等功能,以提高用户体验。
  1. 异步索引更新:目前索引更新是同步的,可能会阻塞 Obsidian 的主线程。可以考虑使用异步任务来更新索引,以避免阻塞主线程。
  1. 高亮显示优化:目前仅仅展示了命中的上下文,缺少关键词高亮显示。可以增加关键词高亮显示,方便用户快速定位。

使用的编程语言和库

  • 编程语言:JavaScript
  • :Obsidian API

Mermaid 流程图

上一篇
指数评估:估值、涨跌与投资策略
下一篇
投资小知识:人口老龄化加速,挑战与机遇并存的养老产业投资

评论
Loading...