PostgreSQL(全文検索)とElasticSearch


10

こんにちは私は私のサービスに検索機能を実装する前にいくつかの研究をしています。現在、PostgreSQLをメインストレージとして使用しています。私は間違いなくPostgreSQLの組み込みの全文検索を使用できますが、問題はデータが複数のテーブルに分散していることです。

私のサービスはeコマースWebサイトです。したがって、顧客が「良いappleラップトップ」を検索した場合、すべての投稿を完全に検索するには、Brandテーブル、postテーブル、およびreviewテーブル(1つの投稿は複数のレビューと短い要約の組み合わせ)を結合する必要があります。elasticsearchを使用する場合、前処理により完全な投稿を挿入できます。

私の調査によると、PostgreSQLのFTSとelasticsearchは同じようなパフォーマンスを発揮するという人もいれば、elasticsearchの方が速いと言う人もいます。私の場合、どちらがより良い解決策でしょうか?

前もって感謝します


検索キーワードがデータベースに保存されているいくつかのテーブルに関連していることをどのようにして知るのですか?
針葉樹

そうではないので、さまざまなテーブルのすべての可能な列を結合し、それらをts_vectorに変換することを考えていました。より良い解決策はありますか?
JSC

うーん、これは意味認識の問題に関係し、別の話です...
針葉樹

回答:


-5

短い答え: Elasticsearchの方が良い

説明: PostgreSQLとElasticsearchは2種類の異なるデータベースです。Elasticsearchはドキュメント検索に強力であり、PostgreSQLは依然として従来のRDBMSです。一部の投稿でテキストを検索するという目標を確認します。PostgreSQLがフルテキスト検索でどのようにうまく機能していても、Elasticsearchは膨大なテキストやドキュメント(またはレコード)を検索するように設計されています。また、検索するサイズが大きいほど、パフォーマンスはPostgreSQLよりもElasticsearchの方が優れています。さらに、Elasticsearchに保存する前に投稿をいくつかのフィールドとインデックスに前処理すると、多くの利点と優れたパフォーマンスを得ることができます。

フルテキスト機能が確実に必要な場合は、MSSQLを検討してください。MSSQLは、PostgreSQLよりも優れている場合があります。

コメントに返信: 異なるタイプのDBでのプロパティ比較の常識である必要があります。OPは、保存されているデータの量とサイズを提供していませんでした。これが検索対象のデータのサイズが小さい場合、PostgreまたはESのどちらを選択してもかまいません。ただし、トランザクションとデータリポジトリが今後さらに大きくなると、ESはそのメリットを享受できます。

このサイトをチェックして、各タイプのDBの現在のランキングを確認し、アプリケーションの将来の要件、アーキテクチャ、データの増加の中から最適なものを選択できます。


リソリックについては同意しますが、証明やその他のソースがあれば、より信頼性が高くなります。
Jaisus

2
あなたの答えはあなたの意見に基づいているだけで、あなたのポイントを証明するための例、ベンチマーク、またはリンクを書いていないし、これらのソフトウェアについて知っていることを証明できる主題に関する他のあなたの答えを見ることはできません。あなたは新しい寄稿者であると思いますので、次回は絶対的な文章を書かず、あなたの経験、実際のデータ、または論文を証明するためのリンクを報告することをお勧めします。
Paolo Melchiorre

@conifersはあなたの回答の更新と明確化を良くしますが、あなたが追加したリンクはあなたの要点を証明しません。比較またはベンチマーク付きのURLを追加するかどうかに興味がありました。
Paolo Melchiorre

人気順によるランキングは、全文検索に関してElasticsearchがPostgreSQLよりも優れていることを意味しません。「より良い」および「常識である必要があります」とは、これらの2つのテクノロジーを比較するベンチマークまたはテストが、回答にないことを期待していることを意味します。
Yasser Sinjab

9

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);

EコマースWebサイトにDjangoを使用している場合は、「PostgreSQLを使用したDjangoでの全文検索」でこの記事を読むこともできます


elasticsearchのステートメントについて何かが間違っています... 彼らはすべてのドキュメントをインデックス化することはできません:確かにできます!PostgreSQLの場合と同様に、インデックス作成中にすでに識別して構成に変換している場合は、最初にDDLを定義する必要があります。彼らは属性にアクセスできません:はい、PostgreSQLは汎用のデータベースであり、CRUDを十分にサポートする必要があるため、本当かもしれません。それらは維持する必要があります:PostgreSQLを維持する必要はありませんか?...どのタイプのDBであっても、定期的なバックアップ、パフォーマンスチューニングが必要です。
針葉樹

彼らはインスタント検索を提供していません:ええと、ESはインスタント検索に強いだけです...最初にKibanaを試してください。これらは一貫性を提供しません。ACIDプロパティでRDBMSが必要なため、これが唯一の真のステートメントになる可能性があります。
針葉樹

1
完全な文は次のとおりです:彼らはインスタント検索を提供しません(新しいデータをダウンロードしてインデックスを再作成する時間が必要です):eコマースWebサイトのユーザーが(質問のように)利用可能な最後のItem1を購入した場合、この情報は即座に保存されますPostgreSQLでは、PostgreSQLの全文検索を使用すると、他のユーザーは検索セクションでItem1を見つけることができません。それ以外の場合、Elasitcsearchを使用する場合、この新しい情報をElasticsearchに送信し、他のユーザーが検索結果にItem1を表示しなくなる前にインデックスを再作成する時間が必要です。多分彼らはそれを購入しようとしますが、それはもう利用できません。:-(
Paolo Melchiorre

2
リストの他のすべてのポイントについて、書きたいことが1つだけあります。元の質問では、@ jscはスタックにPostgreSQLがすでにあるため、データがすでにそこに格納されており、フルテキストを実行するすべての属性にすでにアクセスできると書きましたリレーショナルクエリで検索します。ただし、Elasticsearchを使用する場合は、PGからESにデータの一部(すべての属性ではない)を送信する時間と、ESでデータのインデックスを再作成する時間を追加する必要があります。ESを最後に使用すると、管理する別のサービス、より多くのメモリが占​​有され、冗長データを格納するためのより多くのストレージスペースとプロセス全体の遅延が生じます。
Paolo Melchiorre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.