我正在使用PostgreSQL 10,尽管我有一些编写查询的经验,但我现在对DBMS的了解并不多。我希望我的查询更“智能”,而不仅仅是匹配确切的单词。我做了一个简单的研究,似乎要做到这一点,我们有很多功能。首先,我考虑在查询中使用RegEx,但似乎不是一个好主意,因为RegEx相当有限。我确信Postgres有一些更适合这个的更好的功能。
为了实现我的智能搜索,我提出了这样一个想法:用户可以忘记每个单词中的一个字母,或者重复出现不会导致不匹配的字母。像ç和c这样的字母也应该匹配。 这个想法不是我必须解决的问题的完美再现我只是暴露了我的问题。
例如:
如果用户搜索“macs vermelhas”。我应该返回包含“macas vermelhas”,“maçasvermelhas”,“macs vermelhas”,“macs vrmelhas”的结果。
该系统采用葡萄牙语,我对西班牙语(ê,ü,ã等)的搜索挑战几乎相同。
答案 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)