我在理解PostgreSQL文档时遇到了一些麻烦。显然,示例是文本搜索类似于“caterpiler”的单词。示例取自documentation 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');
个字符
解释分析
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
,还是意味着使用了<->
的其他定义?
此外,是否正在查找字典和/或同义词词典,或者这是<->
的一般特性?文件路径确实看起来像字典,但它似乎并没有被用作字典。
谢谢
1条答案
按热度按时间but5z9lq1#
我假设单词<->'catepiler'使用tsquery <->tsquery语法
不,它使用的是pg_trgm的
text <-> text
运算符。如果pg_trgm不存在,那么你会得到一个错误。另外,EXPLAIN ANALYZE中的“caterpiler”::text是否只是规划器默认将所有字符串视为文本,或者这意味着正在使用的其他定义<->?
对于后者,使用了不同的定义。
文件路径确实看起来像一个字典,但它似乎并没有被用作字典。
这是一个单词列表,在日常意义上并不是一个真正的字典,但尽管如此,这就是文件的名称。注意,这个例子只是使用了一个经常存在于类UNIX系统上的文件。无论是文件,还是它的名称选择,都不是PostgreSQL的一部分。它只是一个方便的例子。