一种在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)
我正在使用 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)