本页介绍自0.44版及更高版本开始的搜索。对于0.43及更老版本,请参见旧版搜索。
- 本地搜索-在当前显示的笔记中搜索。按
CTRL-F
打开搜索对话框。在服务器版本中,这是由浏览器处理的;在桌面版本(electron)中,有一个单独的对话框。 - 笔记搜索-您可以通过在标题,笔记的内容或笔记的attributes中搜索文本来查找笔记。您还可以保存搜索。
- 您可以通过单击左侧的放大镜图标或按
CTRL-S
键盘[快捷键)(./键盘快捷键.md)来激活笔记搜索。
- 您可以通过单击左侧的放大镜图标或按
简单的笔记搜索示例
rings tolkien
- 全文搜索,这将尝试查找在任何地方带有单词"rings"和"tolkien"的音符
"The Lord of the Rings" Tolkien
- 与上述相同,但"The Lord of the Rings"必须完全匹配
towers #book
- 全文搜索与属性搜索的结合-查找在任何地方包含"towers"的笔记,并且它们还需要带有"book"标签
towers #book or #author
- 在任何位置搜索包含"towers"字的笔记,并且匹配的笔记必须带有"book"或"author"标签
towers #!book
-在任何地方搜索包含"towers"的笔记,并且没有"book"标签
#book #publicationYear = 1954
- 将找到带有"book"标签和带有该特定值的"publicationYear"标签的笔记
#genre *=* fan
-匹配带有"genre"标签的笔记,其值包含"fan"子字符串。除了*=*
是"包含"之外,还有=*
是"以...开头",*=
是"以...结尾",!=
是"不等于"
#book #publicationYear >= 1950 #publicationYear < 1960
- 您也可以使用数字运算符-这将查找1950年代出版的所有书籍笔记
#dateNote >= TODAY-30
-特殊的"智能搜索"将查找标签为" dateNote"且具有对应于最近30天的日期的笔记。智能值的完整列表:现在+-秒,今天+-天,每周+-周,月份+-月,年份+-年
~author.title *=* Tolkien
- 查找具有"author"关系并且指向标题中包含单词"Tolkien"的笔记
高级用例
~author.relations.son.title = 'Christopher Tolkien'
- 这将搜索具有"author"关系的笔记,该笔记与"Christopher Tolkien"笔记具有"son"关系。这种情况可以通过以下笔记结构来建模:
- Books
- Lord of the Rings
- label: "book"
- relation: "author" points to "J. R. R. Tolkien" note
- Lord of the Rings
- People
- J. R. R. Tolkien
- relation "son" points to "Christopher Tolkien" note
- Christoper Tolkien
- J. R. R. Tolkien
~author.title *= Tolkien OR (#publicationDate >= 1954 AND #publicationDate <= 1960)
- 您也可以使用布尔表达式和括号将表达式分组
note.parents.title = 'Books'
将查找所有具有(至少一个)名称为" Books"的父笔记。
note.parents.parents.title = 'Books'
这又可以传递使用,因此可以找到其父节点的父节点名称为" Books"的笔记。
note.ancestors.title = 'Books'
这是父母的一种扩展-会在其笔记路径中的任何地方找到祖先的笔记(例如,父母,祖父母,祖父母或外祖父母…),其标题为"Books"。这是一种将搜索范围缩小到特定子树的好方法。
note.children.title = 'sub-note'
因此,这将在另一个方向上起作用,并将找到具有(至少一个)子级的被称为"sub-note"的笔记。
搜索笔记属性
注意具有某些可用于搜索的属性:
- noteId
- dateModified - local dates are in the format "2019-05-19 16:39:47.003+0200"
- dateCreated
- utcDateModified - UTC dates are in the format "2019-05-19 14:39:47.003Z"
- utcDateCreated
- isProtected (true, false)
- type (text, code, search, relation-map, book)
- title (when you want to search specifically the title)
- text - search through note title and content
- labelCount
- relationCount
- attributeCount - labelCount + relationCount
- parentCount
- childrenCount
- isArchived (true, false)
这些可通过note.
访问,例如:
note.type = code AND note.mime = 'application/json'
排序和限制
#author=Tolkien orderBy #publicationDate desc, note.title limit 10
上面的示例将按以下顺序执行以下操作:
- 查找作者标签为"Tolkien"的笔记
- 按PublicationDate的降序排列结果(最新的在最前面)
- 如果发布日期相等,请使用
note.title
的升序作为第二顺序(asc
默认设置,因此可以省略) - 只取前10个结果
Negation
有些查询只能用Negation表示:
#book AND not(note.ancestor.title = 'Tolkien')
这将找到所有不在“Tolkien”子树中的仿书笔记。
内部原理 Under the hood
标签和关系快捷方式
用于按标签搜索的"完整"语法如下:
note.labels.publicationYear = 1954
或者 note.relations.author.title *=* Tolkien
但是考虑到按标签和关系进行搜索非常普遍,因此也存在一种快捷语法:
#publicationYear = 1954
或#author.title *=* Tolkien
。
分隔全文部分和属性部分
从上面的示例中您可能已经注意到,搜索语法允许将全文搜索与基于属性的搜索无缝组合。怎么做?
以tolkien #book
作为一个例子。它包含了:
- 全文token -
tolkien
- 属性表达式 -
#book
棘手的部分是找出全文在哪里结束以及属性表达式在哪里开始。这是通过检测某些停止字符/单词来完成的-在遇到#
、~
、或note.
前缀之一之前,所有令牌都被视为全文。之后,所有字符/token都被理解为属性表达。
如果你想使用#
,~
或note.
作为全文的一部分,你需要排除他们,详见下文。
在某些极端情况下,这还不够,例如:
tolkien (#publicationYear >= 1950 AND #publicationYear < 1960) OR #book`
这里以(
的表达式开头不是(有意)停止字符,因此上面的查询实际上不会按预期运行。相反,在这些特殊情况下,我们需要添加一个单独的额外停止符#
或~
,所以固定查询应如下所示:
tolkien # (#publicationYear >= 1950 AND #publicationYear < 1960) OR #book`
额外的终止符除了将全文部分与属性表达部分分开之外没有其他作用。
转义特殊字符
符号或值有时具有特殊含义,这可能不是您想要的。可以通过以下方式解决此问题:将包含特殊字符的字符串括在引号中,或者使用反斜杠转义各个字符:
"note.txt"
- "note." 通常是停止前缀(stop-prefix),但是在这里它将用于全文搜索
\#hash
- #
通常是停止字符(stop-character),但此处以反斜杠转义,因此再次用于全文
#myLabel = 'Say "Hello World"'
- 支持三种类型的引号:单引号,双引号和反引号。
类型强制转换
重要的是要认识到标签值在技术上始终是字符串,即使它包含逻辑上不同的值也是如此。然后,您可以执行以下操作:
note.dateCreated =* '2019-05'
这将找到在2019年5月创建的笔记,只需在日期上执行字符串"以...开头"即可。
尽管此方法不适用于数字,所以每当检测到数字运算符时,标签值就会从其常规字符串形式强制转换为数字值以进行比较。然后,这允许例如#publicationYear >= 1960
正确工作。
从URL自动触发搜索
像下面的示例一样,打开Trilium将打开搜索窗格并自动触发搜索" abc":
http://localhost:8080/#search=abc