繁体   English   中英

在PostgreSQL中使用to_tsvector和to_tsquery处理错别字

[英]Handling typos with to_tsvector and to_tsquery in postgresql

我有一个包含这些字段的简单表格 在此处输入图片说明

最后两个字段用于索引一个使用tsvector数据类型的索引,另一个使用文本数据类型的索引。

我想对名称或ID进行查询。 我正在做这个

SELECT * FROM foo WHERE foo.searchtext @@ to_tsquery('1234 & abcd');  

它工作正常,但现在我希望删除拼写错误,例如,如果名称是abcd,我键入abbd,那么它应该获取所有可能的值。 我见过pg_tgrm()但它不适用于整数或tsvector

我尝试过使用pg_tgrm()其他选项,例如我将索引存储在另一个具有文本类型和查询的字段searchtextstring中,例如

select *
      from foo
    where searchtextstring % '123' and searchtextstring % 'abbd';

但是我认为这不是有效的方法,而且对于错别字也不起作用。

那么,如何使用to_tsquery处理错别字?

谢谢

全文搜索仅忽略词干和大写字母之间的差异,它不允许您基于相似度查找匹配项。

pg_trgm是必经之路。

我使用以下示例表:

CREATE TABLE foo (id integer PRIMARY KEY, searchtextstring text);

INSERT INTO foo VALUES (1, 'something 0987');
INSERT INTO foo VALUES (2, 'abbd 1224');

CREATE INDEX ON foo USING gist (searchtextstring gist_trgm_ops);

它是如此之小,以至于PostgreSQL将始终使用顺序扫描,因此,如果可能的话,让我们强迫PostgreSQL使用索引(以便我们可以模拟更大的表):

SET enable_seqscan = off;

现在让我们查询:

EXPLAIN (COSTS off)
   SELECT * FROM foo WHERE searchtextstring % '1234'
                       AND searchtextstring % 'abcd';

                       QUERY PLAN                                        
--------------------------------------------------------
 Index Scan using foo_searchtextstring_idx on foo
   Index Cond: ((searchtextstring % '1234'::text)
            AND (searchtextstring % 'abcd'::text))
(2 rows)

索引使用得很好,只需一次索引扫描!

但是查询不返回任何行:

SELECT * FROM foo WHERE searchtextstring % '1234'
                    AND searchtextstring % 'abcd';

 id | searchtextstring 
----+------------------
(0 rows)

那不是因为“它不起作用”,而是因为这两个词不够相似。 不要忘记,四个字母的单词中没有太多的字母,因此,如果您更改一个字母,它们将不再相似。 这不足为奇,对吧?

因此,我们必须降低相似度阈值才能获得结果;

SET pg_trgm.similarity_threshold = 0.1;

SELECT * FROM foo WHERE searchtextstring % '1234'
                    AND searchtextstring % 'abcd';

 id | searchtextstring 
----+------------------
  2 | abbd 1224
(1 row)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM