PostgreSQL(全文搜索)与 ElasticSearch

Posted

技术标签:

【中文标题】PostgreSQL(全文搜索)与 ElasticSearch【英文标题】:PostgreSQL(Full Text Search) vs ElasticSearch 【发布时间】:2020-03-07 18:54:20 【问题描述】:

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

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

根据我的研究,有人说 PostgreSQL 的 FTS 和 elasticsearch 性能相似,有人说 elasticsearch 更快。哪种方案更适合我的情况?

提前致谢

【问题讨论】:

您如何知道搜索关键字与您存储在数据库中的某些表相关? 我没有.. 所以我想加入不同表中所有可能的列并将它们变成 ts_vector。有没有更好的解决方案? 嗯,这会涉及到语义识别的问题,那就另当别论了…… 【参考方案1】:

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

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

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

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

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

如果您想了解更多关于 PostgreSQL 中的 FTS 的信息,请参阅 Oleg Bartunov 的精彩演讲(我从这里提取了上面的列表):“Do you need a Full-Text Search in PostgreSQL ?”

这是一个简短的示例,您可以如何从 SQL 中的多个表创建“文档”(阅读 text search 文档):

SELECT to_tsvector(posts.summary || ' ' || brands.name) 
FROM posts
INNER JOIN brands ON (brand_id = brands.id);

如果您在电子商务网站上使用 Django,您还可以阅读我在“Full-Text Search in Django with PostgreSQL”上写的这篇文章

【讨论】:

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

简答: Elasticsearch 更好

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

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

回复评论: 不同类型数据库的属性比较应该是常识。由于 OP 没有提供存储的数据量和大小。如果这是搜索中的小数据,可能选择 Postgres 或 ES,两者都可以。但是,如果将来事务和数据存储库变得更大,ES 将提供好处。

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

【讨论】:

同意理论,但如果你有一些证据或其他来源,它会更可靠。 您的答案仅基于您的意见,您没有写任何示例、基准或链接来证明您的观点,我看不到您在该主题上的其他答案,可以证明您了解这些软件。我看到你是一个新的贡献者,所以我建议你下次不要写绝对的句子,而是报告你的经验、真实的数据或链接来证明你的论文。 @conifers 很好地更新和澄清了您的答案,但您添加的链接并不能证明您的观点。如果您添加一个带有比较或基准的 URL,我很感兴趣。 按流行度排名并不意味着 Elasticsearch 在全文搜索方面优于 PostgreSQL。 “更好”和“这应该是常识”意味着我们希望看到一些基准或测试来比较您的答案中没有的这两种技术。

以上是关于PostgreSQL(全文搜索)与 ElasticSearch的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 全文搜索权重/搜索词的优先级

全文搜索引擎 Elasticsearch

全文搜索引擎 Elasticsearch 介绍

PostgreSQL 全文搜索和三元组混淆

全文搜索引擎 Elasticsearch 入门教程

全文搜索引擎 Elasticsearch 入门教程