我在理解 PostgreSQL 文档时遇到一些困难。显然,该示例是搜索与“caterpiler”相似(?)的单词的文本。示例取自文档 41.3。相关查询复制如下。物化视图部分不是问题的核心。
CREATE EXTENSION file_fdw;
CREATE SERVER local_file FOREIGN DATA WRAPPER file_fdw;
CREATE FOREIGN TABLE words (word text NOT NULL)
SERVER local_file
OPTIONS (filename '/usr/share/dict/words');
-- previously established that foreign table "words"
-- contains zero counts of 'caterpiler'
SELECT word FROM words ORDER BY word <-> 'caterpiler' LIMIT 10;
-- output
/*
word
---------------
cater
caterpillar
Caterpillar
caterpillars
caterpillar's
Caterpillar's
caterer
caterer's
caters
catered
(10 rows)
*/
解释分析
Limit (cost=11583.61..11583.64 rows=10 width=32) (actual time=1431.591..1431.594 rows=10 loops=1)
-> Sort (cost=11583.61..11804.76 rows=88459 width=32) (actual time=1431.589..1431.591 rows=10 loops=1)
Sort Key: ((word <-> 'caterpiler'::text))
Sort Method: top-N heapsort Memory: 25kB
-> Foreign Scan on words (cost=0.00..9672.05 rows=88459 width=32) (actual time=0.057..1286.455 rows=479829 loops=1)
Foreign File: /usr/share/dict/words
Foreign File Size: 4953699
Planning time: 0.128 ms
Execution time: 1431.679 ms
我假设
word <-> 'catepiler'
使用 tsquery <-> tsquery
语法,但是它在这个查询中是如何工作的以及它如何产生输出顺序? EXPLAIN ANALYZE 中的 'caterpiler'::text
是否只是规划器默认将所有字符串视为 text
,或者这是否意味着正在使用 <->
的其他定义?
此外,是否正在查找字典和/或同义词库,或者这是
<->
的一般功能?文件路径确实看起来像一本字典,但它似乎并没有这样使用。
谢谢
我假设单词 <-> 'catpiler' 使用 tsquery <-> tsquery 语法
不,它正在使用 pg_trgm 的
text <-> text
运算符。如果 pg_trgm 不存在,则会出现错误。
EXPLAIN ANALYZE 中的 'caterpiler'::text 只是规划器默认将所有字符串视为文本,或者这是否意味着正在使用 <-> 的其他定义?
后者,正在使用不同的定义。
文件路径确实看起来像一本字典,但它似乎并没有这样使用。
它是单词列表,实际上并不是日常意义上的字典,但尽管如此,这就是该文件的名称。请注意,该示例仅使用通常存在于类 UNIX 系统上的文件。该文件及其名称选择都不是 PostgreSQL 的一部分。这只是在示例中使用的一个方便的东西。