我正准备在Heroku上部署一个Rails应用程序,它需要全文搜索.到目前为止,我一直在使用MySQL和Sphinx在VPS上运行它.

然而,如果我想在Heroku上使用Sphinx或Solr,我需要支付一个附加组件的费用.

我注意到PostgreSQL(Heroku上使用的数据库)具有内置的全文搜索功能.

我为什么不能使用Postgres的全文搜索?它比狮身人面像慢还是有其他一些主要限制?

推荐答案

编辑,2016年——为什么不能两者兼而有之?

如果你对Postgres vs.Lucene感兴趣,为什么两者都不感兴趣?查看Postgres的ZomboDB扩展,它将Elasticsearch集成为一级索引类型.这仍然是一个相当早期的项目,但对我来说它看起来非常有前途.

(从技术上讲,Heroku上没有,但仍然值得一看.)


披露:我是WebsolrBonsai Heroku插件的联合创始人,所以我的观点有点偏向Lucene.

我对Postgres全文搜索的理解是,对于简单的用例来说,它非常可靠,但Lucene(以及Solr和ElasticSearch)在性能和功能方面都优于它的原因有很多.

首先,jpountz为这个问题提供了一个真正优秀的技术答案,Why is Solr so much faster than Postgres?值得通读几遍才能真正理解.

我还 comments 了一篇recent RailsCast episode篇文章,比较了Postgres全文搜索和Solr的相对优势和劣势.让我在这里重述一下:

对研究生的实用优势

  • 重用已经运行的现有服务,而不是设置和维护(或支付)其他服务.
  • 远远优于速度极其缓慢的SQL LIKE运算符.
  • 因为数据都在同一个数据库中,所以保持数据同步的麻烦更少——没有与某些外部数据服务API的应用程序级集成.

Solr(或ElasticSearch)的优势

在我的头顶上,没有特别的顺序…

  • 与常规数据库负载分开扩展索引和搜索负载.
  • 更灵活的术语分析,如口音规范化、语言词干分析、N-gram、标记删除……其他很酷的功能,如拼写判断、"丰富内容"(如PDF和Word)提取…
  • Solr/Lucene可以在Postgres full-text search TODO list上做任何事情.
  • 更好更快的术语相关性排名,可在搜索时高效定制.
  • 对于常见术语或复杂查询,搜索性能可能会更快.
  • 可能比Postgres更高效的索引性能.
  • 通过将索引与主数据存储分离,更好地容忍数据模型中的更改

显然,我认为基于Lucene的专用搜索引擎是更好的 Select .基本上,你可以把Lucene看作是一个事实上的开源搜索专家库.

但是,如果你唯一的 Select 是LIKE操作员,那么Postgres全文搜索肯定会成功.

Postgresql相关问答推荐

在Docker Compose中获取CSV文件数据?

Select 所有数组类型和维度

为什么更新不设置较晚的结束时间?

为什么Postgres优化器切换到嵌套循环进行连接?

Postgres从spark触发post-write

PostgreSQL中如何在同一行中存储多个与单个值相关的ID?

连接到 PostgreSQL 时没有属性执行错误

我应该 Select 哪种数据类型?

GORM 不会创建 many2many 关联

是否可以在 postgresql 中添加表元数据?

PostgreSQL错误致命:角色 username不存在

如何在构建时链接 docker 容器?

Select 空字段

从局域网访问 PostgreSQL 服务器

datagrip 无法应用更改 此表是只读的

在同一台机器上创建多个 Postgres 实例

使用 Hibernate 注释映射 PostgreSQL 串行类型

postgres regexp_replace 只想允许 a-z 和 A-Z

使用 Postgres 在 Rust 的 Diesel 库中添加时间戳

PostgreSQL - 作为表名的动态值