web-dev-qa-db-ja.com

MongoDB + ElasticsearchまたはElasticsearchのみ?

大量のデータをインデックス化し、リアルタイムで提供するための新しいプロジェクトがあります。また、ファセット、フルテキスト、地理空間を使用した複雑な検索もしています...

最初のプロトタイプはMongoDBでインデックスを作成し、次にElasticsearchにインデックスを作成することです。Elasticsearchは保存されたファイルにチェックサムを適用せず、インデックスは完全に信頼できないと読んだためです。しかし、最後のバージョン(バージョン1.5)以降、チェックサムがあり、Elasticsearchをプライマリデータストアとして使用できるかどうかを推測していますか?また、Elasticsearchに加えてMongoDBを使用する利点は何ですか?

Elasticsearchのそれらの機能に関する最新の答えが見つかりません

どうもありがとう

33
user1853777

ESの代わりに、または一緒にMongoを使用するための引数について話す

  1. ユーザー/ロール管理。

    • MongoDBに組み込まれています。すべてのニーズに合うとは限らず、どこか不器用かもしれませんが、それは存在し、かなり前に実装されました。
    • ESのセキュリティで唯一のものは shield です。ただし、本番用のGold/Platinumサブスクリプションに対してのみ出荷されます。
  2. スキーマ

    • ESはスキーマレスですが、Luceneの上に構築され、Javaで記述されています。このツールの核となるアイデア-ドキュメントのインデックス作成と検索、およびこの方法での作業にはインデックスの一貫性が必要です。バックエンドでは、すべてのドキュメントをフラットluceneインデックスに収める必要があります。これには、ネストされたドキュメントと値をESがどのように処理するか、速度とデータの完全性のバランスを保つためにインデックスを整理する方法についてある程度の理解が必要です/一貫性。 ESを使用するには、スキーマに関するいくつかのことを常に念頭に置く必要があります。すなわち、対応するマッピングを事前に設定することなく、ほとんどすべてをESにインデックス付けできるため、ESはその場でマッピングを「推測」できますが、間違ったマッピングをしたり、暗黙のマッピングが悪かったりすることがあります。/oインデックス全体の再インデックス付け。そのため、ESをスキーマレスストアとして扱わない方がよいでしょう。これは、レーキをしばらく踏むことができるためです(これはpain:))が、少なくともドキュメントを操作するときは、具体的なフィールドにスライスできるスキーマ集約型として扱います。
    • 一方、モンゴはあなたが入れたほとんどすべてのものから「噛んでパン粉を残さない」ことができます。そして、ほとんどのクエリは、MongoがJavaScriptの観点からデータをどのように処理するかを覚えているまではうまく機能します。 JSは型付けが弱いため、本当にスキーマレスなワークフローで作業できます(もちろん、必要な場合)
  3. テーブルのようなデータの処理。

    • ESは、検索インデックスに入れずにデータを処理するように制限されています。そして、このソリューションは、(検索したいデータと比較して)追加のデータを保存および取得する必要がある場合に十分です。
    • MongoDBは gridFS をサポートします。これにより、同じインターフェイスの背後にある大量のデータを処理できます。つまり、コードの観点から、Mongoにバイナリデータを保存して、同じインターフェイス内で取得できます。
46
Slam

さて、適切な仕事に適切なツールを選択してください。全文検索やファセットなどの検索機能が必要な場合、本格的な検索エンジンに勝るものはありません。 ElasticSearch(ES)またはSolrは選択の問題です。

実際にESにドキュメントをフィード(インデックス)して検索し、MongoDBまたは他のデータベースから特定のエントリの完全な詳細を取得できます。

あなたのタスクを簡単にすることができます。MongoDB、ES、Redis、RabbitMQを使用するオープンソースの作品をご覧ください。これらはすべて1か所に統合​​されています ここgithub

アプリケーションは.Net C#で構築されていることに注意してください。

2
Amit Kr

会社で最近機能を開発しましたが、

いくつかの検索を実行し、複数の要因と条件の関連性に従って結果をランク付けしたかったのです。

そのため、私のアプリケーションでは、すでにMongoDBをDbとして使用していましたが、

そのため、ElasticSearchインデックスで、検索とフィルターを実行するフィールドのいくつかをMongoDBからエクスポートしました。必要な条件に応じて、mongoクエリとelasticsearchクエリも準備し、検索を実行しました。次に、必要に応じて結果をフィルタリングおよびソートしました。フロー全体は、ESからエラーが発生した場合でも、mongoがレコードを取得するように設計されています。 ESから結果を取得した場合、mongoの結果はESの結果に依存します。これが、mongoとESを組み合わせて使用​​した方法です。

また、すべての更新、削除、および新しいレコードの挿入を適切に処理することを忘れないでください。

そして、知っておくと、私にとっての結果は本当に良いものでした。

0

本番環境でElasticsearchを使用した後、このスレッドにいくつかのメモを追加できます:

  • クエリを許可する前に、要求時にクライアント証明書の信頼性をチェックするリバースプロキシを介してElasticsearchクラスタリングをセキュリティで保護しました。とにかく認証を追加する複数の方法があることを証明します。 (ロールを使用するなど、セキュリティの精度がさらに必要な場合は、権限を管理するために追加できるプラグインはほとんどありません)
  • Elasticsearchのマッピングと設定(チューニング)は、実稼働を開始する前に完全に理解するための非常に重要な概念であり、すべてが迅速に機能するようにするのは簡単なことではありません。
  • クラスタリングと水平スケーリングは非常に柔軟でセットアップが簡単です
  • スイートツール(キバナ、ビートなど)は、ログを収集したり、キーデータを公開したりするための非常に便利な方法です...
  • 検索機能は非常に高度で、全文検索の仕組み(ファジー、ブースティング、スコアリング、ステミング、トークナイザー、アナライザーなど)を少しマスターすれば、本当に素晴らしいことができます。
  • APIは少しばらばらで、何かを達成するユニークな方法はありません。また、一括挿入APIのように、一部のAPIは実際に使用するWTFです。JSON形式(行末文字を忘れないでください)でバイナリデータを渡し、いくつかのフィールドを複数回繰り返す必要があります。これは非常に冗長で、私たち全員がプロジェクトに持っているようなレガシーコードだと思います;)。
  • 最後に:Javaプロジェクトを開発する場合、データソースからESクラスターにデータを複製するためにHibernate Searchを使用しないでください。繰り返しますが、手動で行います。

実際の質問について:

私の考えでは、Elasticsearchのみを使用するだけで十分であり、複数のNoSQLストレージシステムを使用する複雑さを軽減できます。

デュオのリレーショナルデータベースとトランザクションデータベース+ NoSQL検索エンジンを使用している場合に価値があると思いますが、ほぼ同じ目的を果たす2つのシステムがあるのは少しやり過ぎです

0
Alex