PostgreSQL(全文搜索)与 ElasticSearch

J.S*_*S.C 35 postgresql full-text-search elasticsearch

嗨,在将搜索功能应用到我的服务中之前,我正在做一些研究。我目前使用 PostgreSQL 作为我的主要存储。我绝对可以使用 PostgreSQL 的内置全文搜索,但问题是我的数据分散在几个表中。

我的服务是一个电子商务网站。因此,如果客户搜索“好苹果笔记本电脑”,我需要连接Brand表、post表和review表(1 个帖子是多个评论 + 简短摘要的组合)以完全搜索所有帖子。如果我使用 elasticsearch,我可以通过预处理插入完整的帖子。

根据我的研究,有人说 PostgreSQL 的 FTS 和 elasticsearch 性能相似,有人说 elasticsearch 更快。对于我的情况,哪个是更好的解决方案?

提前致谢

Pao*_*rre 54

如果 PostgreSQL 已经在您的堆栈中,那么最适合您的选择是使用 PostgreSQL 全文搜索。

为什么要在 PostgreSQL 中进行全文搜索 (FTS)?

因为否则您必须将数据库内容提供给外部搜索引擎。

外部搜索引擎(例如 elasticsearch)速度很快,但是

  • 他们无法索引所有文档 - 可能是完全虚拟的
  • 他们无权访问属性 - 没有复杂的查询
  • 它们必须维护——DBA 头疼
  • 有时他们需要认证
  • 他们不提供即时搜索(需要时间下载新数据和重新索引)
  • 它们不提供一致性——搜索结果可能已经从数据库中删除

如果你想阅读更多关于 PostgreSQL 中 FTS 的内容,Oleg Bartunov 有一个很棒的演讲(我从这里提取了上面的列表):“你需要在 PostgreSQL 中进行全文搜索吗?

这是一个简短的示例,您可以在 SQL 中从多个表创建“文档”(阅读文本搜索文档):

SELECT to_tsvector(posts.summary || ' ' || brands.name) 
FROM posts
INNER JOIN brands ON (brand_id = brands.id);
Run Code Online (Sandbox Code Playgroud)

如果您在电子商务网站上使用 Django,您还可以阅读我写的这篇文章“使用 PostgreSQL 在 Django 中进行全文搜索

  • 抱歉,但所有这些读起来都非常有偏见。 (9认同)
  • 完整的句子是 **他们不提供即时搜索(需要时间下载新数据并重新索引)** :这意味着如果您在电子商务网站上的用户(如问题中所示)购买了最后一个可用的 Item1,则这信息立即存储在 PostgreSQL 上,如果您使用 PostgreSQL 的全文搜索,其他用户将无法在搜索部分找到 Item1。否则,如果您使用 Elasitcsearch,则需要时间将此新信息发送到 Elasticsearch 并重新索引,然后其他用户将不再在搜索结果中看到 Item1。也许他们试图购买它,但它不再可用。:-( (6认同)
  • 关于列表中的所有其他点,我只想写一件事:在原始问题 @jsc 中写道,他们的堆栈中已经有 PostgreSQL,因此数据已经存储在那里,他们已经可以访问所有属性来执行全文使用关系查询进行搜索。但是如果你使用 Elasticsearch,你必须添加时间将一小部分数据(不是所有属性)从 PG 发送到 ES,以及在 ES 中重新索引数据的时间。最后使用ES你将需要管理另一个服务,占用更多的内存,更多的存储空间来存储冗余数据和整个过程的延迟。 (5认同)
  • 关于elasticsearch的声明有些错误...... **他们无法索引所有文档:**当然可以!如果您在索引时已经识别并将其转换为您的配置,就像在 PostgreSQL 中一样,您需要首先定义 DDL。**他们无权访问属性**:是的,这可能是真的,因为 PostgreSQL 是通用数据库,需要很好地支持 CRUD。**必须维护**:PostgreSQL不需要维护吗?...无论什么类型的DB,日常的备份、性能调优还是需要的。 (4认同)
  • 另一个缺点是你会引起 PG 和 ES 之间的耦合。令开发人员和开发架构师头疼的问题。没有一个可以在不影响另一个的情况下改变。 (2认同)

yur*_*ons 10

我找到了2021 年的研究以及一些基准

Postgresql 与 ElasticSearch 性能图

有用的结论
随着 PostgreSQL 的每个新版本,搜索响应时间都在改善,并且与 ElasticSearch 相比,它正在朝着同类比较的方向发展。因此,如果项目不打算拥有数百万条记录或大规模数据,Postgresql 全文搜索将是最佳选择。


Con*_*ers -14

简短回答: Elasticsearch 更好

说明: PostgreSQL 和 Elasticsearch 是两种不同类型的数据库。Elasticsearch 对于文档搜索功能强大,而 PostgreSQL 是传统的 RDBMS。无论 PostgreSQL 在全文搜索方面做得有多好,Elasticsearch 都是为搜索大量文本和文档(或记录)而设计的。而且你想要搜索的大小越大,Elasticsearch 的性能就越优于 PostgreSQL。此外,如果您在将帖子存储到 Elasticsearch 之前将帖子预处理到多个字段和索引中,您还可以获得许多好处和出色的性能。

如果你确实需要全文功能,你可以考虑MSSQL,它可能比PostgreSQL做得更好。

回复评论: 不同类型的DB的属性比较应该是常识。由于OP没有提供存储的数据量和大小。如果这是小规模的搜索数据,也许选择Postgres或ES,两者都可以。然而,如果未来交易和数据存储变得更大,ES 将带来好处。

您可以查看此网站,了解每种类型数据库的当前排名,并根据您的应用程序的需求、架构和未来数据增长选择最佳的一种。

  • 您的回答仅基于您的意见,您没有编写任何示例、基准或链接来证明您的观点,我看不到您关于该主题的其他答案可以证明您了解这些软件。我看到你是一个新的贡献者,所以我建议你下次不要写绝对的句子,并报告你的经历、真实数据或链接来证明你的论文。 (32认同)
  • 按受欢迎程度排名并不意味着 Elasticsearch 在全文搜索方面优于 PostgreSQL。“更好”和“这应该是常识”意味着我们希望在您的答案中看到一些比较这两种技术的基准或测试,但实际上并没有。 (8认同)
  • “提及次数”和“公共利益”是软件选择的最差标准,也许网站设计除外。 (3认同)