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毫秒。 |
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。