一种在PostgreSQL中搜索相似词的好方法

A good way to search for similar words in PostgreSQL

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

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

例如:

如果用户搜索 "macs vermelhas"。我应该 return 结果包含 "macas vermelhas"、"maças vermelhas"、"macs vermelhas"、"macs vrmelhas".

该系统是葡萄牙语的,我遇到了几乎相同的西班牙语搜索挑战(ê、ü、ã 等)。

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

CREATE EXTENSION pg_trgm;

让我们有一个这样的table:

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)