[英]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.