postgres 中神奇的拼写错误纠正器?

问题描述 投票:0回答:1

我在理解 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
,或者这是否意味着正在使用
<->
的其他定义?

此外,是否正在查找字典和/或同义词库,或者这是

<->
的一般功能?文件路径确实看起来像一本字典,但它似乎并没有这样使用。

谢谢

sql postgresql syntax full-text-search
1个回答
0
投票

我假设单词 <-> 'catpiler' 使用 tsquery <-> tsquery 语法

不,它正在使用 pg_trgm

text <-> text
运算符。如果 pg_trgm 不存在,则会出现错误。

EXPLAIN ANALYZE 中的 'caterpiler'::text 只是规划器默认将所有字符串视为文本,或者这是否意味着正在使用 <-> 的其他定义?

后者,正在使用不同的定义。

文件路径确实看起来像一本字典,但它似乎并没有这样使用。

它是单词列表,实际上并不是日常意义上的字典,但尽管如此,这就是该文件的名称。请注意,该示例仅使用通常存在于类 UNIX 系统上的文件。该文件及其名称选择都不是 PostgreSQL 的一部分。这只是在示例中使用的一个方便的东西。

© www.soinside.com 2019 - 2024. All rights reserved.