PG中文社区 /
mdi-home
首页 社区新闻 中文文档 加入ACE {{ item.text }} 登录
mdi-home 首页 mdi-chat-processing 社区新闻 mdi-book-open-variant 中文文档 mdi-account-multiple-check 加入ACE mdi-file-multiple-outline 相关资料 mdi-blank {{item.text}} mdi-exit-to-app 退出账号
利用PostgreSQL实现毫秒级全文检索

原作者:谢丽  创作时间:2015-05-13 00:00:00+08  
doudou586 发布于2015-05-18 11:11:37           评论: 2   浏览: 11203   顶: 1764  踩: 1318 

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毫秒。


  • 评论:2   浏览: 11203                   顶: 1764  踩: 1318 

    请在登录后发表评论,否则无法保存。

    1# __ xcvxcvsdf 回答于 2024-10-12 02:35:01+08
    https://huaqiaocheng.tiancebbs.cn/ http://ly.shtcxxw.cn/haidong/ http://cf.lstcxxw.cn/esmbc/ http://bjtcxxw.cn/ahwh/ http://shenghuo.china-bbs.com/hetian/ http://nalei.zjtcbmw.cn/shxuhui/ http://nalei.zjtcbmw.cn/yichun/ http://xinguang.sctcbmw.cn/shpudong/ http://gx.lztcxxw.cn/sjqz/ http://fuyang.tjtcbmw.cn/jzqz/ http://tuiguang.hntcxxw.cn/yiyang/ http://fuyang.tjtcbmw.cn/gsqyc/ https://yufusi.tiancebbs.cn/ http://xinguang.sctcbmw.cn/bayinguoleng/ http://huaguang.jxtcbmw.cn/yingkou/ https://longhua.tiancebbs.cn/ https://haojiangqs.tiancebbs.cn/

    2# __ xiaowu 回答于 2024-04-21 07:31:39+08
    适合女生打游戏的名字:https://www.nanss.com/mingcheng/509.html 歌唱祖国的歌曲:https://www.nanss.com/shenghuo/852.html 安全生产责任书:https://www.nanss.com/gongzuo/1120.html 让人看了心情好的网名:https://www.nanss.com/mingcheng/712.html 好听个性名字:https://www.nanss.com/mingcheng/1224.html 圣诞节逗比句子:https://www.nanss.com/yulu/1020.html 生活中的点点滴滴说说:https://www.nanss.com/wenan/1498.html 描写冬天景色优美句子:https://www.nanss.com/xuexi/1107.html 最有个性的网名:https://www.nanss.com/mingcheng/1170.html 微信网名伤感心痛:https://www.nanss.com/mingcheng/981.html 职业规划结束语:https://www.nanss.com/xuexi/860.html 一个字网名:https://www.nanss.com/mingcheng/857.html 抖音火爆昵称:https://www.nanss.com/mingcheng/1489.html 男人好听的微信名字大全:https://www.nanss.com/mingcheng/979.html 繁体网名:https://www.nanss.com/mingcheng/1400.html 王者荣耀id:https://www.nanss.com/mingcheng/991.html 劲舞团昵称:https://www.nanss.com/mingcheng/1222.html 天翼决名字:https://www.nanss.com/mingcheng/1345.html 简单的网名:https://www.nanss.com/mingcheng/1228.html 湘菜馆名字:https://www.nanss.com/shenghuo/1289.html 经典qq网名:https://www.nanss.com/mingcheng/1436.html 仙气十足的网名:https://www.nanss.com/mingcheng/792.html 兽人战士名字:https://www.nanss.com/mingcheng/1315.html 可爱网名:https://www.nanss.com/mingcheng/1402.html 冬奥会的意义和精神:https://www.nanss.com/shenghuo/1041.html 内涵深意的二字网名:https://www.nanss.com/mingcheng/1353.html 中西文化差异:https://www.nanss.com/xuexi/502.html 钳工实习报告:https://www.nanss.com/gongzuo/757.html 学困生转化记录:https://www.nanss.com/gongzuo/1321.html 适合70后的昵称:https://www.nanss.com/mingcheng/703.html



    发表评论:
    加入我们
    QQ群1:5276420
    QQ群2:3336901
    QQ群3:254622631
    文档群:150657323
    文档翻译平台:按此访问
    社区邮件列表:按此订阅
    商业支持
    扫码关注
    加入我们
    QQ群1:5276420
    QQ群2:3336901
    QQ群3:254622631
    文档群:150657323
    文档翻译平台:按此访问
    社区邮件列表:按此订阅
    商业支持
    扫码关注
    © PostgreSQL中文社区 ... (自2010年起)