逻辑搜索字段数据库选择问题

时间:2012-04-27 19:24:15

标签: sql postgresql node.js search

这是一个有点复杂但很简单的问题。我正在创建一个允许存储在对象上的小应用程序,该对象具有标题,描述,标签和子对象。科目包含评论。使用搜索字段查找这些对象中的任何匹配项的理想方法是什么。

e.g。 object 1 {id:1,title:test,description:fun,tags:[{games,toys}]} subobject 1 {lid:1,comment:'this is fun and fast'}

说我搜索:快乐。 或者我搜索:测试

我希望其中任何一个都返回相同的对象。

我知道我必须通过空格或逗号来爆炸变量并创建一个数组,但是我应该如何构造sql。

我不是要创建一个复杂的页面排名algrothim,如果我必须限制搜索标题或标签或描述我会这样做。

注意:这是一个简单的应用程序,我只是在寻找选项。

2 个答案:

答案 0 :(得分:1)

我知道的最简单的方法是使用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

答案 1 :(得分:0)

最简单的方法是将您的字段组合成JSON对象,并将其放在MongoDB或其他JSON数据库中