SQL&Query 用法记录

本贴最后更新于 355 天前,其中的信息可能已经渤澥桑田

思源的 SQL 和 Query 联合使用,搜索汇聚文档内容的功能十分强大,个人感觉并不亚于 Obsidian 中的 dataview 查询,在某些便利度方便甚至有所超越。不过问题就是 SQL 的语法对于小白来说还是有点复杂的,很多想法不知道怎么写。

对于纯代码小白来说,推荐使用这位大佬制作的 SQL 生成器:【分享】SQL 查询生成器及使用说明(quicker 动作) - 链滴,对于制作一些简单的 SQL 查询来说是没有问题的。我以下的分享属于符合个人口味的一些定做,写在这里,权当是一种备份吧

1. 搜索:通过多个关键词定位文档

这个问题我原先提过一次,D 大也给与了答复,当时算是初步解决了。

不过在后来的使用中我感到上贴中提到的方法过于麻烦,用 SQL 语句的方式,对关键词的增加和删除操作都比较繁琐。所以有空稍微摸索了一下,得到了一种更简便的解决方法。

这里有个前提,就是多关键词搜索和单关键词搜索的最终目标是不一样的。单关键词定位的是句、段、块等文章内的部分内容,然后通过部分去观察整体。而多关键词一般是需要定位整篇文章,比如我记得某篇文章里我写过“思源”和“内容块”这两个关键词,但是我不记得具体是哪篇文章了,这时候就需要多关键词模糊搜索去定位文章了。

所以,对我而言,多关键词搜索只需要展示对应的文档名即可,基于这一思路,使用 query 挂件,写入以下代码,可以完美解决。

/* 多个关键词模糊搜索 */
SELECT
'[' || b.content || '](siyuan://blocks/' || b.id || ')' 
    AS __00____pre__文档名,
    b.created AS __02____date__创建时间,
    b.updated AS __03____datetime__更新时间
    /* 创建时间和更新时间这两行,如不需要可删除 */
FROM blocks AS b where
path NOT LIKE '%此处填入当前文档的ID%' /* 排除当前文档 */
and (id in (select root_id from blocks where content like "%关键词一%")) 
and (id in (select root_id from blocks where content like "%关键词二%")) 
/* 需要更多的关键词可自行复制粘贴最后一行,并修改关键词 */

效果如下,此时鼠标移动到浮窗上就可以快速预览,通过预览判断是否自己寻找的文章。

image.png

如过觉得文档结果太多,需要更精准的搜索结果,在代码末尾复制一行即可,效果如下

image.png

2. 随机漫步:更智能的随机漫步

思源使用 SQL 语句已经实现了随机漫步,不过嵌入块的感觉是不太好。因为结果是平铺展开的,如果随机到一篇十分熟稔又很长的文章,通常我会快速的滑动滚轮进入下一篇文章观看,但嵌入块之间没有明显的分隔,导致经常滑过头然后重新返回来。随机时经常会遇到这样的状况,所以后来我已经不想在随机漫步了

不过解决了第 1 个问题之后,我受到了启发。随机漫步,其实没必要把每篇文章都平铺展示出来,只展示个文档名不就够了吗?思源的浮窗这么好用,展示个文档名之后,可以浮窗预览也可以点击跳转,想看的就看,不想看的就随机下一轮,这才是我心中的随机漫步啊

于是再次通过 query,我实现了这一功能,写入以下代码即可

SELECT
'[' || b.content || '](siyuan://blocks/' || b.id || ')' 
    AS __00____pre__文档名,
    b.created AS __02____date__创建时间,
    b.updated AS __03____datetime__更新时间
    /* 创建时间和更新时间这两行,如不需要可删除 */
FROM blocks AS b where
/* 如果想铺开展示结果,可以使用自带的嵌入块功能。把上面↑↑的代码替换成
SELECT * FROM blocks WHERE即可 */

path NOT LIKE '%此处填入当前文档的ID%' /* 排除当前文档 */

and (id in (select root_id from blocks where content like "%关键词%")) 
/* 在包含关键词的所有文档中随机漫步,如不需指定关键词,就将上面这一行替换为
and type='d' */

and not id in (
  select root_id 
  from blocks 
  group by root_id 
  having count(root_id )<=2
) 
/* 排除子块数量小于2的文档,因为这种文档一般是空文档 */

order by random() limit 5
/* 随机排序,结果展示数量一次限制5条,可自行更改结果限制条数 */

效果如下

image.png

PS:这个随机漫步我个人觉得尚有缺陷,但是本人代码小白改不来,还请路过的大佬不略赐教。

如果用一个搜索条件,能够让每个文档展示前 2-3 行内容就好了,这样扫一眼就知道随机的文档是不是我需要阅读的,连浮窗预览都不需要了

3. daily note 拓展:另类的流式日记界面

目前想查看近期写下的 dailynote 记录有三种方式,或者通过搜索,或者通过文档树,或者用 SQL 聚合。但是这三种方式都有点不方便(仅就我个人而言)

  • 搜索:每次都要写搜索条件,麻烦
  • 文档树:需要点击文档,查看几天的就需要点击几次,还是有点麻烦(日历挂件和此条一样)
  • SQL 聚合:有时候一条 dn 记录太长了,不过我看前三行就知道这条写的是什么内容,无需全文查看。但 SQL 是全文铺开,不想看也得看,和用 SQL 进行随机漫步的问题是一样的

那有没有一种办法,不需点击,在同一个界面中,只需滑动鼠标就可以快速查看近期的 dn 记录呢?

有的,打开 query,写入以下代码

SELECT * FROM blocks As b WHERE
(id in (select parent_id from blocks where type !='l' ) 
and type='i' and subtype = 'u'  and markdown like '%* ((%') 
and root_id !='' 

and b.path like '/此处填入日记本的文档ID/%/%/%'
/* /%代表层级,日记有几层就写几个/% */

order by created DESC limit 50
/* 按创建时间降序排列,结果展示数量一次限制50条,可自行更改结果限制条数 */

举个栗子,下图是我今天的记录

image.png

使用 query 后会展示成如下样式

image.png

写入的文本会全部展示,但是其实,第一条记录,我只需要展示 3 行就足以了解我记录的是什么了,并不需要全文展示。所以接下来,我们按住 shift 然后点击 query 左边的按钮给 query 添加属性“query-maxrow”

image.png

query-maxrow 意思为限制行数,数值填 2 就是 2 行,3 就是 3 行,我设置成 3 行之后在点击 query 就会生成如下界面

image.png

大功告成,在这个界面滑动滚轮就可以畅通无阻的查看近期的 dn 记录,不再需要多次点击了。如果觉得某条记录很重要想查看更多信息,就把鼠标移动到“列表项”上,可以浮窗预览

注意:这段代码只能展示使用无序列表的引用块,换句话说,只能汇合传递型双链


2023 年 5 月 6 日更新:我发现将 query 的属性设置如下

image.png

会生成如下界面

image.png

简直是我心中完美的流式日记页面了 🎉

缺陷是不能在这个界面中新建日记文档,但是对于往期的查阅来说是足足够用了,而且最重要的是,在记录够多的时候,它的卡顿情况比展开全部反链好很多

4. daily note 拓展:找出孤立的空文档,便于删除

在写下 dailynote 记录的时候,有时候会错写双链名称从而创建新的页面,这时候删除链接,只是把链接删除了而已,链接生成的页面并不会删除。用 query 写入以下代码,可以找出这种错误创建的孤立空文档。当然,查找出的文档是不是真的可以删除的空文档,还是自己通过浮窗确认一下比较好

SELECT
'[' || b.content || '](siyuan://blocks/' || b.id || ')' 
    AS __00____pre__文档名称,
    b.created AS __02____datetime__创建时间,
    b.updated AS __03____datetime__更新时间
FROM blocks AS b where 

path like '%此处填入块引新建文档的ID%'
/* 只筛选块引新建文档存放的文件夹位置。具体位置点开笔记本设置,找到块引新建文档存放位置,复制文档的ID填入 */

and not id in (
  select def_block_root_id
  from refs 
) /* 筛选无反向链接的文档 */

and not id in (
  select root_id
  from refs 
) /* 筛选无正向链接的文档 */

and id in (
  select root_id 
  from blocks 
  group by root_id 
  having count(root_id )<=2
) 
/* 筛选子块数量小于2的文档,因为部分文档虽然没有任何链接,但是写了很多内容,把这部分文档排除掉 */

and type ='d'
order by created DESC

会生成如下界面

image.png

删不删除都可以,至少能够找出来了,强迫症满足trollface

5. 备注:查询并展示

思源目前已经支持备注了,但是使用自带的搜索,搜索备注只能搜索到块,并不能展示备注的内容,这也是个小问题,但是 D 大精力有限,我们就自行通过 query 完善一下

SELECT * FROM blocks As b WHERE
memo LIKE '%备注中包含的关键词%'
order by created DESC 
limit 50

写入以上代码,并添加 query 的属性设置 query-fields,值填入 ["ial","type","markdown","created","updated"] 即可,会生成如下界面

image.png

备注能够显示出来了,具体的段落块则可以通过浮窗查看

  • 思源笔记

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

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

    18687 引用 • 69746 回帖 • 2 关注
2 操作
Reader 在 2023-05-06 15:32:07 更新了该帖
Reader 在 2023-05-06 15:07:36 更新了该帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
请输入回帖内容 ...