思源怎么实现 Obsidian 这样的搜索效果?困扰了好久,用 SQL 能实现吗?

本贴最后更新于 239 天前,其中的信息可能已经时移世异

如图,在 Obsidian 中,这样搜索,会出现一个结果(红框所示):

ob 搜索.png

而在思源中,相同的内容,用相同的关键字搜索,除了出现一个和 Obsidian 一样的结果,还会把包含这个结果的所有父级也作为结果(红框所示)。对我来说,这些结果都是重复的,白白增加了筛选的麻烦。

sy 搜索.png

怎么让思源实现 Obsidian 这样的搜索效果呢?SQL 我一直搞不定 😭。有没有可能在搜索功能上做一些改进?

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    28442 引用 • 119754 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 应该搞不定,但只搜索 opq 的话可以试试这个 SQL:

    SELECT * FROM blocks WHERE type != 'l' AND fcontent LIKE '%关键词%';
    
    1 回复
  • wilsons 2 评论

    @JeffreyChen 主要是用户未必知道哪个在前,毕竟是搜索嘛

    以下 SQL 可以查询不重复的内容。

    但,这个查询不支持直接查询到子级,仅查询到最外层,即顶级那一层就行,不显示子级的内容,即达到不重复的目的。

    因为查询到子级纯 SQL 太麻烦了,可能有子级的子级,关键词交叉等,不好实现。

    sql 查询代码(支持思源全局搜索,嵌入块查询,Query 挂件,简单查询)

    SELECT *
    FROM (
        SELECT b.*
        FROM blocks b
        LEFT JOIN blocks p ON b.parent_id = p.id
        WHERE b.type = 'l'
          AND b.markdown LIKE '%opq%'
          AND b.markdown LIKE '%uvw%'
          AND (
              b.parent_id = b.root_id
              OR (p.type IS NULL OR p.type NOT IN ('l', 'i'))
          )
    ) AS blocks;
    

    openAny 实现方式(需要先安装 openAny 代码 [js] 连续点击 openAny,小代码,大作用,让一切触手可达

    image.png

    // // 快速查询不重复列表(自动生成SQL并打开全局搜索对话框)
    {
        let results = await openAny.fn.showInputBox('', '', '请输入要查询的关键词,空格代表并且,OR代表或');
        if (results) {
            // 检查是否包含 OR 逻辑
            if (results.includes(' OR ')) {
                // 按 OR 分割,并去重、过滤空字符串
                const orKeywords = [...new Set(results.split(' OR '))]
                    .filter(keyword => keyword.trim())
                    .map(keyword => `b.markdown LIKE '%${keyword}%'`)
                    .join(' OR ');
                results = `AND (${orKeywords})`;
            } else {
                // 如果没有 OR,则按空格分割,并去重、过滤空字符串
                results = [...new Set(results.split(' '))]
                    .filter(keyword => keyword.trim())
                    .map(keyword => `AND b.markdown LIKE '%${keyword}%'`)
                    .join(' ');
            }
            // 构造最终 SQL 查询
            const sql = `select * from (SELECT b.* FROM blocks b LEFT JOIN blocks p ON b.parent_id = p.id WHERE b.type = 'l' ${results} AND (b.parent_id = b.root_id OR (p.type IS NULL OR p.type NOT IN ('l', 'i')))) as blocks`;
            openAny.press((navigator.platform.indexOf("Mac") > -1) ? 'meta+p' : 'ctrl+p')
                .clicks('#searchSyntaxCheck', '[data-name="searchMethod"] .b3-menu__item:nth-child(3)')
                .input(sql, '#searchInput');
        }
    }
    
    1 回复
    4 操作
    wilsons 在 2025-04-27 09:03:58 更新了该回帖
    wilsons 在 2025-04-27 00:20:52 更新了该回帖
    wilsons 在 2025-04-27 00:00:15 更新了该回帖
    wilsons 在 2025-04-26 23:53:19 更新了该回帖
    有道理
    JeffreyChen
    如果知道哪个是第一个,可以这样,select * from blocks where type = 'i' and fcontent like '%opq%' and (markdown like '%opq%' and markdown like '%uvw%'),优点是简单,可以放到思源自带查询中 SQL 查询。
    wilsons
  • 试了一下没有结果:

    image.png

    1 回复
  • 刚才 SQL 有误,已更新

    1 回复
    1 操作
    wilsons 在 2025-04-27 09:56:04 更新了该回帖
  • 貌似还是不行,会查到上层:

    image.png

    1 回复
  • 这回可以了,SQL 已更新

    1 回复
    1 操作
    wilsons 在 2025-04-27 09:55:41 更新了该回帖
  • 仍然是查到了上层,并且形式貌似就不是楼主想要的了

    image.png

    1 回复
  • 哈哈,那个 SQL 确实有问题,但是不是查到上层的问题。

    因为,我就没有想要查询的子级,子级用纯 SQL 太麻烦了,甚至无法实现,除非用 js 一点点过滤。

    如果子级的子级还有关键词呢,甚至多个关键词前后交叉呢,该怎么显示,太复杂。

    我给的结果是查询到最外层,即顶级那一层就行,不显示子级的内容,即达到不重复的目的即可。

    之前那个 SQL 的问题是同一个 root_id 的只能查询到一个,现在更改了实现方式,应该可以了。

    另外,我发现思源全局搜索,如果复杂查询,必须加一层 SELECT * FROM (这是是复杂查询结果) as blocks;才行。

  • qiancang

    有两种方法:

    1、使用这个 quicker 动作生成 sql 一炮三响解决方案测试 - by 浅沧 - 动作信息 - Quicker

    2、使用 query view 插件,有对一炮三响进行处理,具体要看下插件的使用说明。

  • 集市插件里用「简易搜索」限定要搜索的块类型,这是最简单的方法

请输入回帖内容 ...

推荐标签 标签

  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖 • 2 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 367 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 144 回帖
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    269 引用 • 666 回帖 • 1 关注
  • AWS
    11 引用 • 28 回帖 • 2 关注
  • 安装

    你若安好,便是晴天。

    134 引用 • 1184 回帖 • 2 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    695 引用 • 538 回帖 • 1 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 236 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 342 关注
  • 创业

    你比 99% 的人都优秀么?

    81 引用 • 1396 回帖 • 1 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 63 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 475 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    34 引用 • 333 回帖
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 121 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 191 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 46 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    182 引用 • 400 回帖
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    43 引用 • 130 回帖 • 259 关注
  • abitmean

    有点意思就行了

    44 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • 电影

    这是一个不能说的秘密。

    125 引用 • 610 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 565 关注
  • 音乐

    你听到信仰的声音了么?

    63 引用 • 513 回帖
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    293 引用 • 4496 回帖 • 687 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖