在PostgreSQL中搜索类似单词的好方法

时间:2018-05-29 14:03:41

标签: postgresql similarity

我正在使用PostgreSQL 10,尽管我有一些编写查询的经验,但我现在对DBMS的了解并不多。我希望我的查询更“智能”,而不仅仅是匹配确切的单词。我做了一个简单的研究,似乎要做到这一点,我们有很多功能。首先,我考虑在查询中使用RegEx,但似乎不是一个好主意,因为RegEx相当有限。我确信Postgres有一些更适合这个的更好的功能。

为了实现我的智能搜索,我提出了这样一个想法:用户可以忘记每个单词中的一个字母,或者重复出现不会导致不匹配的字母。像ç和c这样的字母也应该匹配。 这个想法不是我必须解决的问题的完美再现我只是暴露了我的问题。

例如:

如果用户搜索“macs vermelhas”。我应该返回包含“macas vermelhas”,“maçasvermelhas”,“macs vermelhas”,“macs vrmelhas”的结果。

该系统采用葡萄牙语,我对西班牙语(ê,ü,ã等)的搜索挑战几乎相同。

1 个答案:

答案 0 :(得分:0)

我认为三元组索引非常适合你。

CREATE EXTENSION pg_trgm;

我们有一个这样的表:

CREATE TABLE words (word text);

INSERT INTO words VALUES ('maças vermelhas');
INSERT INTO words VALUES ('alguna cosa');

CREATE INDEX ON words USING gin (word gin_trgm_ops);

现在你可以通过相似性找到单词:

SELECT * FROM words WHERE word % 'macs vermelhas';

      word       
-----------------
 maças vermelhas
(1 row)

可以使用索引(在这种情况下强制它):

SET enable_seqscan=off;

EXPLAIN (COSTS OFF)
   SELECT * FROM words WHERE word % 'macs vermelhas';

                     QUERY PLAN                      
-----------------------------------------------------
 Bitmap Heap Scan on words
   Recheck Cond: (word % 'macs vermelhas'::text)
   ->  Bitmap Index Scan on words_word_idx
         Index Cond: (word % 'macs vermelhas'::text)
(4 rows)