Postgresql 支持Postgres FTS中的打字错误

Postgresql 支持Postgres FTS中的打字错误,postgresql,full-text-search,Postgresql,Full Text Search,这是真的 SELECT to_tsvector('The quick brown fox jumped over the lazy j-80 dog') @@ to_tsquery('j-80'); 这些返回值为false: -- no minus char SELECT to_tsvector('The quick brown fox jumped over the lazy j-80 dog') @@ to_tsquery('j80'); -- a typo, t

这是真的

SELECT to_tsvector('The quick brown fox jumped over the lazy j-80 dog')  
    @@ to_tsquery('j-80');
这些返回值为false:

-- 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在trigram算法中几乎没有关联:

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

基本上,它们都是以j开头的,这就是你的全部。(它们也都以0结尾,但在一个单词的末尾,至少需要2个字符,以将其看作是一个匹配——开始比结尾有更多的权重)。再加上零件号的简短、标点符号的不一致(特别是如果零件号可以嵌入空格),以及拼写错误的可能性,所有这些都构成了一个非常困难的问题。如果您可以以某种方式将零件号提取到它们自己的列中,并标准化该列和查询中的标点符号(例如,通过删除所有标点符号),则可以使用pg_trgm索引或运算符。但由于零件号只有3个字符长,您仍然没有太多可供选择的内容。例如,j80和j90在trigram算法中几乎没有关联:

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

基本上,它们都是以j开头的,这就是你的全部。(它们也都以0结尾,但是在一个单词的末尾,至少需要2个字符,以将其看作是一个匹配——开始比结尾更重)。怎么会有人知道j90实际上不是指j90,而是一个打字错误?一开始很难对不属于某种已知语言的东西进行拼写检查。在我的例子中,j-80是特定品牌的制造商零件号。很抱歉,我把它混入了这个简化的例子中。对于j90,我们就说它不存在。如果存在的话,我希望看到j90和j80都能以更高的排名出现。j-80有什么意义吗?怎么会有人知道j90实际上不是指j90,而是一个打字错误?一开始很难对不属于某种已知语言的东西进行拼写检查。在我的例子中,j-80是特定品牌的制造商零件号。很抱歉,我把它混入了这个简化的例子中。对于j90,我们就说它不存在。如果存在的话,我希望看到j90和j80都以更高的排名出现。