我知道的最简单的方法是使用 PostgreSQL trigram 搜索。假设你有一个这样的表:
CREATE TABLE t (id int NOT NULL PRIMARY KEY, value text);
INSERT INTO t VALUES (1, '{id:1, title:test, description:fun, tags:[{games, toys}]} subobject 1 {lid:1, comment:''this is fun and fast''}');
您可以使用以下方法准备搜索:
CREATE EXTENSION pg_trgm;
CREATE INDEX t_trgm ON t USING gin (value gin_trgm_ops);
SELECT set_limit(0.05);
您只需为每个数据库安装一次扩展。您可以使用 GiST 或 GIN 索引;只需使用相应的操作集。GiST 通常更新速度更快;GIN 通常搜索速度更快——因此最佳选择取决于工作量。我将连接的相似性限制设置为 5%,因为您似乎对字符串的一小部分匹配感到满意。根据需要进行调整。请记住,此限制是基于会话的,因此您需要在使用 % 运算符之前在连接上设置它。
完成该设置后,以下是搜索:
SELECT * FROM t WHERE value % 'test';
SELECT * FROM t WHERE value % 'fun fast';
没有比这更简单的了。
虽然当表中只有一行时它甚至可能不会使用索引,但我们发现在我们的生产数据库中有数百万行要搜索,相似性搜索通常会在几十毫秒内运行。
http://www.postgresql.org/docs/current/interactive/pgtrgm.html