簡體   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