支持 Postgres FTS 中的拼写错误

Supporting typos in Postgres FTS

这return是正确的

SELECT to_tsvector('The quick brown fox jumped over the lazy j-80 dog')  
    @@ to_tsquery('j-80');

这些return错误:

-- no minus char
SELECT to_tsvector('The quick brown fox jumped over the lazy j-80 dog')  
    @@ to_tsquery('j80');

-- a typo, typing 9 instead of 8
SELECT to_tsvector('The quick brown fox jumped over the lazy j-80 dog')  
    @@ to_tsquery('j90');

-- the user searches with a space 'j 80'
SELECT to_tsvector('The quick brown fox jumped over the lazy j-80 dog')  
    @@ to_tsquery('j & 80');

我如何改进查询或 tsvector 以便我对上述所有内容都成立?

很难有效地处理普通英语和技术术语的未注释混合体,例如零件号。再加上零件号的短小、标点符号的不一致(特别是如果零件号可以嵌入空格)以及拼写错误的可能性,所有这些加在一起就成了一个非常棘手的问题。如果您能以某种方式将部件号提取到它们自己的列中,并在该列和查询中标准化标点符号(例如,通过删除所有标点符号),那么您可以使用 pg_trgm 索引或运算符。但是由于零件号只有 3 个字符长,您仍然没有太多可去的地方。例如,j80 和 j90 在三元算法中几乎没有关系:

create extension if not exists pg_trgm;
select similarity('j80', 'j90');
 similarity 
------------
   0.142857

基本上,它们都是以 j 开头的。 (它们也都以 0 结尾,但三元组需要在一个单词的末尾至少有 2 个字符才能认为它是匹配的——开头比结尾更重要)。