ltree模块提供几种数据类型:
-
ltree 存储标签路径。
-
lquery 表示一个正规表达式类似的模式以匹配ltree值。 在一个路径中一个单词匹配那个标签。星号(*)匹配零个或多个标签。例如:
- foo 准确匹配标签路径 foo
- .foo. 匹配任何包含标签 foo 的标签路径
- *.foo 匹配任何以 foo 结束的标签路径
可以量化星号来限制可以匹配多少个标签:
- *{n} 准确匹配 n 个标签
- *{n,} 至少匹配 n 个标签
- *{n,m} 至少匹配 n 个但不超过 m 个标签
- *{,m} 最多匹配 m 个标签 — 和 *{0,m 相同}
有几个修饰符可以放在lquery中非星号标签的后面,使其不只是匹配正好的那个:
- @ 匹配大小写无关,例如 a@ 匹配 A
-
-
匹配任何带有这个前缀的标签,例如 foo* 匹配 foobar
-
- % 匹配字首下划线分开的单词
%
的行为稍微有点复杂。它试图匹配单词而不是整个标签。例如foo_bar%
匹配foo_bar_baz
而不是foo_barbaz
。如果与*结合,前缀匹配分别应用到每个单词,例如foo_bar%*
匹配foo1_bar2_baz
而不是not foo1_br2_baz
。
还有,可以写几个由| (OR)分开的标签以匹配任意这些标签, 并且可以在开始放置! (NOT)以匹配任何不匹配任何可选标签的标签。
这是一个带有评注的lquery的例子:
Top.*{0,2}.sport*@.!football|tennis.Russ*|Spain
a. b. c. d. e.
这个查询将匹配任何标签路径:
- 以标签Top开始
- 然后有0到2个标签
- 然后是一个带有大小写不敏感前缀sport的标签
- 然后是一个既不匹配football也不匹配tennis的标签
- 然后以一个带有Russ或准确匹配Spain开头的标签作为结束。
- ltxtquery表示一个匹配ltree值的全文本搜索风格模式。 ltxtquery值包含单词,可能在结尾带有修饰词@, *, %, 这些修饰词的含义和在lquery中的含义相同。单词可以与& (AND), | (OR), ! (NOT) 和圆括号结合。与lquery 主要的不同是ltxtquery匹配单词时不考虑单词在标签路径中的位置。
- 这是一个ltxtquery的例子:
- Europe & Russia*@ & !Transportation
这将匹配包含Europe标签和以Russia (大小写不敏感)开始的标签的路径,但是不匹配包含Transportation 标签的路径。这些单词在路径中的位置并不重要。还有,当使用了%时, 该单词能匹配标签中任何用下划线分隔单词,不管位置在哪。
注意:ltxtquery允许符号之间有空格,但是ltree 和 lquery不允许这样做。
类型ltree有平常的比较操作符=, <>, <, >, <=, >=。 比较的优先级以树遍历的顺序,节点的子节点以标签文本排序。