W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
這個(gè)模塊實(shí)現(xiàn)了一種數(shù)據(jù)類型ltree
用于表示存儲(chǔ)在一個(gè)層次樹(shù)狀結(jié)構(gòu)中的數(shù)據(jù)的標(biāo)簽。還提供了在標(biāo)簽樹(shù)中搜索的擴(kuò)展功能。
這個(gè)模塊被視為“trusted”,也就是說(shuō),它可以是由擁有CREATE
特權(quán)的非超級(jí)用戶安裝在當(dāng)前數(shù)據(jù)庫(kù)上。
一個(gè)標(biāo)簽是一個(gè)字母數(shù)字字符和下劃線的序列(例如,在 C 區(qū)域中允許字符A-Za-z0-9_
)。 標(biāo)簽長(zhǎng)度必須少于 256 字符。
例子: 42
, Personal_Services
一個(gè)標(biāo)簽路徑是由點(diǎn)號(hào)分隔的零個(gè)或者更多個(gè)標(biāo)簽的序列,例如L1.L2.L3
,它表示一個(gè)從層次樹(shù)的根到一個(gè)特定節(jié)點(diǎn)的路徑。 一個(gè)標(biāo)簽路徑的長(zhǎng)度不能超過(guò)65535標(biāo)簽。
例子:Top.Countries.Europe.Russia
ltree
模塊提供多種數(shù)據(jù)類型:
ltree
存儲(chǔ)一個(gè)標(biāo)簽路徑。
lquery
表示一個(gè)用于匹配ltree
值的類正則表達(dá)式的模式。一個(gè)簡(jiǎn)單詞匹配一個(gè)路徑中的那個(gè)標(biāo)簽。 一個(gè)星號(hào)(*
)匹配零個(gè)或更多個(gè)標(biāo)簽。它們可以用點(diǎn)連接起來(lái),以形成一個(gè)必須匹配整個(gè)標(biāo)簽路徑的模式。例如:
foo 正好匹配標(biāo)簽路徑foo
*.foo.* 匹配任何包含標(biāo)簽foo
的標(biāo)簽路徑
*.foo 匹配任何最后一個(gè)標(biāo)簽是foo
的標(biāo)簽路徑
星號(hào)和簡(jiǎn)單詞都可以被限定來(lái)限制它能匹配多少標(biāo)簽:
*{n
} 匹配正好n
個(gè)標(biāo)簽
*{n
,} 匹配至少n
個(gè)標(biāo)簽
*{n
,m
} 匹配至少n
個(gè)但是最多m
個(gè)標(biāo)簽
*{,m
} 匹配最多m
個(gè)標(biāo)簽 — 與*{0,m
}相同
foo{n
,m
} 匹配至少 n
但是不超過(guò) m
并發(fā)的 foo
foo{,} 匹配任何數(shù)量的并發(fā)的 foo
, 包括零
在缺乏任何顯式量詞的情況下,星號(hào)的默認(rèn)值是匹配任意數(shù)量的標(biāo)簽(也就是{,}
),而非星號(hào)項(xiàng)的默認(rèn)值是只匹配一次(也就是{1}
)。
有幾個(gè)修飾符可以放在一個(gè)非星號(hào)的lquery
項(xiàng)的末尾,使它能匹配除了精確匹配之外更多的匹配:
@ 不區(qū)分大小寫匹配,例如a@
匹配A
* 匹配帶此前綴的任何標(biāo)簽,例如foo*
匹配foobar
% 匹配開(kāi)頭以下劃線分隔的詞
%
的行為有點(diǎn)復(fù)雜。它嘗試匹配詞而不是整個(gè)標(biāo)簽。例如,foo_bar%
匹配foo_bar_baz
但是不匹配foo_barbaz
。如果和*
組合,前綴匹配可以單獨(dú)應(yīng)用于每一個(gè)詞,例如foo_bar%*
匹配
foo1_bar2_baz
但不匹配foo1_br2_baz
。
此外,你可以寫多個(gè)帶有|
(OR)的可能改過(guò)的非星號(hào)項(xiàng)目來(lái)匹配那些項(xiàng)目中的任何一個(gè)(或幾個(gè)),并且你可以在非星號(hào)組最前面放上!
(NOT)來(lái)匹配任何不匹配那些分支的標(biāo)簽。 量詞,若有的話,位于組的末尾;它意味著作為一個(gè)整體的組的一些匹配(也就是說(shuō),一些匹配或不匹配任何替代的標(biāo)簽)。
這里是一個(gè)lquery
的例子:
Top.*{0,2}.sport*@.!football|tennis{1,}.Russ*|Spain
a. b. c. d. e.
這個(gè)查詢將匹配任何這樣的標(biāo)簽路徑:
開(kāi)始于標(biāo)簽Top
并且接著具有 0 到 2 個(gè)標(biāo)簽
之后是一個(gè)開(kāi)始于大小寫無(wú)關(guān)的前綴sport
的標(biāo)簽
然后有一個(gè)或多個(gè)標(biāo)簽,沒(méi)有匹配football
和tennis
。
并且結(jié)尾是一個(gè)開(kāi)始于Russ
的標(biāo)簽,或者完全匹配Spain
的標(biāo)簽。
ltxtquery
表示一種用于匹配ltree
值的類全文搜索的模式。一個(gè)ltxtquery
值包含詞,也可能在末尾帶有修飾符@
、*
、%
,修飾符具有和lquery
中相同的含義。詞可以用
&
(AND)、|
(OR)、!
(NOT)以及圓括號(hào)組合。lquery
和ltxtquery
的關(guān)鍵區(qū)別是前者匹配詞時(shí)不考慮它們?cè)跇?biāo)簽路徑中的位置。
這是一個(gè)ltxtquery
的例子:
Europe & Russia*@ & !Transportation
這將匹配包含標(biāo)簽Europe
以及任何以Russia
開(kāi)始(大小寫不敏感)的標(biāo)簽的路徑,但是不匹配包含標(biāo)簽Transportation
的路徑。這些詞在路徑中的位置并不重要。還有,當(dāng)使用%
時(shí),該次可以與一個(gè)標(biāo)簽中任何下劃線分隔的詞匹配,而不管它們的位置如何。
注意:ltxtquery
允許符號(hào)之間的空白,但是ltree
和lquery
不允許。
類型ltree
有普通比較操作符 =
、<>
、 <
、>
、<=
、>=
。 比較會(huì)按照樹(shù)遍歷的順序排序,一個(gè)節(jié)點(diǎn)的子女按照標(biāo)簽文本排序。另外,還有
表 F.13中顯示的特殊操作符。
表 F.13. ltree
操作符
操作符 描述 |
---|
左參數(shù)是右參數(shù)(或相等)的祖先么? |
左參數(shù)是右參數(shù)(或相等)的后代么? |
|
|
|
連接 |
把文本轉(zhuǎn)換為 |
數(shù)組中包含一個(gè) |
數(shù)組中包含一個(gè) |
數(shù)組中包含匹配 |
Does |
數(shù)組中包含匹配 |
返回作為 |
返回作為 |
返回匹配 |
返回匹配 |
操作符<@
、@>
、 @
以及~
有類似的、 ^<@
、^@>
、^@
、
^~
,只是它們不適用索引。它們只對(duì)測(cè)試目的有用。
可用的函數(shù)在表 F.14中。
表 F.14. ltree
函數(shù)
ltree
支持一些能加速上述操作符的索引類型:
ltree
上的 B-樹(shù)索引: <
、<=
、=
、 >=
、>
ltree
之上的GiST索引(gist_ltree_ops
opclass): <
、<=
、=
、 >=
、>
、
@>
、<@
、 @
、~
、?
gist_ltree_ops
GiST opclass將一組路徑標(biāo)簽近似計(jì)算為位圖簽名。 它的可選整數(shù)參數(shù)siglen
決定了簽名的字節(jié)長(zhǎng)度。默認(rèn)簽名長(zhǎng)度為8字節(jié)。 簽名長(zhǎng)度的有效值在1到2024字節(jié)之間。更長(zhǎng)的簽名將導(dǎo)致更精確的搜索(掃描更小的索引部分和更少的堆頁(yè)),但代價(jià)是更大的索引。
創(chuàng)建默認(rèn)簽名長(zhǎng)度為8字節(jié)的索引的例子:
CREATE INDEX path_gist_idx ON test USING GIST (path);
創(chuàng)建簽名長(zhǎng)度為100字節(jié)的索引的例子:
CREATE INDEX path_gist_idx ON test USING GIST (path gist_ltree_ops(siglen=100));
ltree[]
之上的GiST索引(gist__ltree_ops
opclass): ltree[] <@ ltree
、ltree @> ltree[]
、 @
、~
、
?
gist__ltree_ops
GiST opclass 的工作類似于gist_ltree_ops
并且也使用簽名長(zhǎng)度作為參數(shù)。 gist__ltree_ops
中的siglen
的默認(rèn)值為28字節(jié)。
創(chuàng)建這樣一個(gè)默認(rèn)簽名長(zhǎng)度為28字節(jié)的索引的例子:
CREATE INDEX path_gist_idx ON test USING GIST (array_path);
創(chuàng)建這樣一個(gè)簽名長(zhǎng)度為100字節(jié)的索引的例子:
CREATE INDEX path_gist_idx ON test USING GIST (array_path gist__ltree_ops(siglen=100));
注意:這種索引類型是有損的。
這個(gè)例子使用下列數(shù)據(jù)(在源代碼發(fā)布的contrib/ltree/ltreetest.sql
文件中也有):
CREATE TABLE test (path ltree);
INSERT INTO test VALUES ('Top');
INSERT INTO test VALUES ('Top.Science');
INSERT INTO test VALUES ('Top.Science.Astronomy');
INSERT INTO test VALUES ('Top.Science.Astronomy.Astrophysics');
INSERT INTO test VALUES ('Top.Science.Astronomy.Cosmology');
INSERT INTO test VALUES ('Top.Hobbies');
INSERT INTO test VALUES ('Top.Hobbies.Amateurs_Astronomy');
INSERT INTO test VALUES ('Top.Collections');
INSERT INTO test VALUES ('Top.Collections.Pictures');
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy');
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Stars');
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Galaxies');
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Astronauts');
CREATE INDEX path_gist_idx ON test USING GIST (path);
CREATE INDEX path_idx ON test USING BTREE (path);
現(xiàn)在,我們有一個(gè)表test
,它被填充了描述下列層次的數(shù)據(jù):
Top
/ | \
Science Hobbies Collections
/ | \
Astronomy Amateurs_Astronomy Pictures
/ \ |
Astrophysics Cosmology Astronomy
/ | \
Galaxies Stars Astronauts
我們可以做繼承:
ltreetest=> SELECT path FROM test WHERE path <@ 'Top.Science';
path
------------------------------------
Top.Science
Top.Science.Astronomy
Top.Science.Astronomy.Astrophysics
Top.Science.Astronomy.Cosmology
(4 rows)
這里是一些路徑匹配的例子:
ltreetest=> SELECT path FROM test WHERE path ~ '*.Astronomy.*';
path
-----------------------------------------------
Top.Science.Astronomy
Top.Science.Astronomy.Astrophysics
Top.Science.Astronomy.Cosmology
Top.Collections.Pictures.Astronomy
Top.Collections.Pictures.Astronomy.Stars
Top.Collections.Pictures.Astronomy.Galaxies
Top.Collections.Pictures.Astronomy.Astronauts
(7 rows)
ltreetest=> SELECT path FROM test WHERE path ~ '*.!pictures@.Astronomy.*';
path
------------------------------------
Top.Science.Astronomy
Top.Science.Astronomy.Astrophysics
Top.Science.Astronomy.Cosmology
(3 rows)
這里是一些全文搜索的例子:
ltreetest=> SELECT path FROM test WHERE path @ 'Astro*% & !pictures@';
path
------------------------------------
Top.Science.Astronomy
Top.Science.Astronomy.Astrophysics
Top.Science.Astronomy.Cosmology
Top.Hobbies.Amateurs_Astronomy
(4 rows)
ltreetest=> SELECT path FROM test WHERE path @ 'Astro* & !pictures@';
path
------------------------------------
Top.Science.Astronomy
Top.Science.Astronomy.Astrophysics
Top.Science.Astronomy.Cosmology
(3 rows)
使用函數(shù)的路徑構(gòu)建:
ltreetest=> SELECT subpath(path,0,2)||'Space'||subpath(path,2) FROM test WHERE path <@ 'Top.Science.Astronomy';
?column?
------------------------------------------
Top.Science.Space.Astronomy
Top.Science.Space.Astronomy.Astrophysics
Top.Science.Space.Astronomy.Cosmology
(3 rows)
我們可以通過(guò)常見(jiàn)一個(gè)在路徑中指定位置插入標(biāo)簽的 SQL 函數(shù)來(lái)簡(jiǎn)化:
CREATE FUNCTION ins_label(ltree, int, text) RETURNS ltree
AS 'select subpath($1,0,$2) || $3 || subpath($1,$2);'
LANGUAGE SQL IMMUTABLE;
ltreetest=> SELECT ins_label(path,2,'Space') FROM test WHERE path <@ 'Top.Science.Astronomy';
ins_label
------------------------------------------
Top.Science.Space.Astronomy
Top.Science.Space.Astronomy.Astrophysics
Top.Science.Space.Astronomy.Cosmology
(3 rows)
有一些額外的擴(kuò)展為 PL/Python 實(shí)現(xiàn)了ltree
類型的轉(zhuǎn)換。 這些擴(kuò)展是ltree_plpythonu
、ltree_plpython2u
以及ltree_plpython3u
(PL/Python 命名習(xí)慣請(qǐng)見(jiàn) 第 45.1 節(jié))。如果安裝了這些轉(zhuǎn)換并且在 創(chuàng)建函數(shù)時(shí)指定了它們,ltree
值會(huì)被映射為 Python 列表( 不過(guò),當(dāng)前并不支持逆向的轉(zhuǎn)換)。
強(qiáng)烈建議轉(zhuǎn)換擴(kuò)展安裝在與ltree
相同的模式中。否則,如果轉(zhuǎn)換擴(kuò)展的模式包含惡意用戶定義的對(duì)象,就會(huì)存在安裝時(shí)的安全隱患。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: