利用PostgreSQL实现毫秒级全文检索

利用PostgreSQL实现毫秒级全文检索,第1张

概述Lateral是一家内容推荐服务提供商,其模拟程序使用PostgreSQL存储文档。每个文档包含一个 text列和一个存储标题、日期和URL等元数据的JSON列。他们希望为模拟程序创建快速搜索功能,搜索文档全文和标题,生成推荐内容。近 日,Lateral首席技术官Max撰文介绍了他们的做法。 为了实现这一目标,可以选择开源解决方案Apache Solr或Elasticsearch,也可以选择托管解

Lateral是一家内容推荐服务提供商,其模拟程序使用Postgresql存储文档。每个文档包含一个 text列和一个存储标题、日期和URL等元数据的JsON列。他们希望为模拟程序创建快速搜索功能,搜索文档全文和标题,生成推荐内容。近 日,Lateral首席技术官Max撰文介绍了他们的做法。

为了实现这一目标,可以选择开源解决方案Apache Solr或Elasticsearch,也可以选择托管解决方案Elastic或Algolia,但出于以下考虑,他们选择了Postgresql的全文搜索功能:

不需要额外安装软件或库 可以重用他们在应用程序中使用的数据库接口 不需要配置额外的服务器 不增加成本 数据可以存储在可控的地方 不需要在不同的数据源之间同步数据

虽然Postgresql搜索的精度和大规模查询速度存在缺陷,但Max认为,它可以满足他们的应用场景。以下是他们的做法:

创建一个列tsv,存储tsvector值; 在新建的列上创建索引,并用下面的语句填充列:
UPDATE data_rows SET tsv=setweight(to_tsvector(coalesce(Meta->>'Title','')),'A') ||setweight(to_tsvector(coalesce(text,'D');

此处需要注意,JsON列的权重为A,text列的权重为D; 创建tsv列更新函数;在表上创建触发器,当更新和新增行时,执行tsv列更新函数。 当一切就绪后,替换下面代码中的“你的查询”并执行:
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毫秒。

总结

以上是内存溢出为你收集整理的利用PostgreSQL实现毫秒级全文检索全部内容,希望文章能够帮你解决利用PostgreSQL实现毫秒级全文检索所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1175615.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存