Lateral 是一家内容推荐服务提供商,其 模拟程序 使用 PostgreSQL 存储文档。每个文档包含一个text列和一个存储标题、日期和URL等元数据的JSON列。他们希望为模拟程序创建快速搜索功能,搜索文档全文和标题,生成推荐内容。近日,Lateral首席技术官Max 撰文 介绍了他们的做法。
为了实现这一目标,可以选择开源解决方案 Apache Solr 或 Elasticsearch ,也可以选择托管解决方案 Elastic 或 Algolia ,但出于以下考虑,他们选择了 PostgreSQL的全文搜索功能 :
虽然PostgreSQL搜索的精度和 大规模查询速度存在缺陷 ,但Max认为,它可以满足他们的应用场景。以下是他们的做法:
在新建的列上创建索引,并用下面的语句填充列:
UPDATE data_rows SET tsv =setweight(to_tsvector(coalesce(meta->>'title','')), 'A') ||setweight(to_tsvector(coalesce(text,'')), 'D');
此处需要注意,JSON列的权重为A,text列的权重为D;
当一切就绪后,替换下面代码中的“你的查询”并执行:
SELECT id, meta->>'title' as title, meta FROM ( SELECT id, meta, tsv FROM data_rows, plainto_tsquery('你的查询') AS q WHERE (tsv @@ q) ) AS t1 ORDER BY ts_rank_cd(t1.tsv, plainto_tsquery('你的查询')) DESC LIMIT 5;
经测试,该查询大约50毫秒即可完成。如果返回文档全文,则会增加大约350毫秒,这更多的可能是受网络负载影响。如果只返回文档中的200个字符,则仅仅增加大约100毫秒。
感谢崔康对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入InfoQ读者交流群 )。