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

标签 sql postgresql node.js search

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

例如 对象 1 {id:1, title:test, description:fun, tags:[{games, toys}]} subobject 1 {lid:1, comment:'this is fun and fast'}

假设我搜索:快速有趣。 或者我搜索:测试

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

我知道我必须用空格或逗号分解变量并创建一个数组,但我应该如何构造 sql。

我并不是要创建一个复杂的网页排名算法,如果我必须限制通过标题或标签或描述进行搜索,我会这样做。

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

最佳答案

我知道的最简单的方法是使用 PostgreSQL 三元组搜索。假设您有一个这样的表:

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%,因为您似乎对字符串的一小部分匹配很满意。根据需要进行调整。请记住,此限制是基于 session 的,因此您需要在使用 % 运算符之前在连接上进行设置。

完成该设置后,这里是搜索:

SELECT * FROM t WHERE value % 'test';
SELECT * FROM t WHERE value % 'fun fast';

没有比这更简单的了。

虽然当表中只有一行时它甚至可能不会使用索引,但我们发现在我们的生产数据库中有数百万行要搜索,通常会运行相似性搜索在几十毫秒内。

http://www.postgresql.org/docs/current/interactive/pgtrgm.html

关于sql - 逻辑搜索字段数据库选择问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10356654/

相关文章:

sql - 用另一个数据库中的数据替换数据库的所有表,除了一个

ruby-on-rails - Rails 模型 - 更新 JSON 中的嵌套键/值

sql - 选择最后一组连续行中的第一行

node.js - 如何在 cassandra 中执行查询后立即插入行?

javascript - 遍历html文件获取href

MySQL 错误 1241 (21000) : Operand should contain 1 column(s) on Aggregate Query

sql - 如何使用游标比较两个不同表的两列中的值

Ruby 中的 SQL 搜索

如果子查询之一为空,Mysql select from subqueries返回空集

node.js - PM2 应用程序版本不可用