支持 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 个字符才能认为它是匹配的——开头比结尾更重要)。
这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 个字符才能认为它是匹配的——开头比结尾更重要)。