データベースとしてのNoSQL(MongoDB)とLucene(またはSolr)


280

ドキュメントベースのデータベースに基づいて成長するNoSQLの動きに伴い、最近、MongoDBを検討しました。Lucene(およびSolrのユーザー)と同様に、アイテムを「ドキュメント」として扱う方法との驚くべき類似性に気づきました。

それで、質問:Lucene(またはSolr)よりもNoSQL(MongoDB、Cassandra、CouchDBなど)を「データベース」として使用する理由は何ですか?

私が(そして他の人も確実に)答えを探しているのは、それらのいくつかの詳細な比較です。リレーショナルデータベースのディスカッションは、目的が異なるため、まとめてスキップしてみましょう。

Luceneには、強力な検索や重み付けシステムなど、いくつかの深刻な利点があります。Solrのファセットは言うまでもありません(SolrはすぐにLuceneに統合されます、そうです!)。Luceneドキュメントを使用してIDを保存し、MongoDBと同じようにドキュメントにアクセスできます。それをSolrと組み合わせると、WebServiceベースの負荷分散ソリューションが得られます。

MongoDBの同様のデータ保存とスケーラビリティについて話すとき、VelocityやMemCachedなどのアウトオブプロセスキャッシュプロバイダーの比較を投入することもできます。

MongoDBに関する制限はMemCachedの使用を思い出させますが、MicrosoftのVelocityを使用して、MongoDBよりもグループ化とリスト収集の機能を強化できます(私はそう思います)。メモリにデータをキャッシュするよりも高速またはスケーラブルなものを取得できません。Luceneにもメモリプロバイダーがあります。

MongoDB(およびその他)には、APIの使いやすさなど、いくつかの利点があります。ドキュメントを新規作成し、IDを作成して保存します。できました。簡単です。



4
ありがとう、しかしそれは私の質問に答えません:つまり、なぜデータベースにLuceneの代わりにMongoDBを使用するのですか?どちらもドキュメントを処理しますが、Luceneには非常に強力な検索オプションがいくつかあります。+1関連する質問を実際に見つけるため。Stackoverflowで数回検索しましたが、ほぼ比較できませんでした。
eduncan911 2010

MongoDBと同様の機能を提供するLuceneをどのように使用していますか?ストレージ用にリレーショナルDBに関連付けていますか?
フィリップティニー

1
@フィリップ:それは架空の質問です。ドキュメントストレージとしてLuceneを使用してみませんか?検索能力と拡張性が大幅に向上します(Solrと組み合わせると、Luceneがさらに使いやすくなります)。
eduncan911 2010

回答:


250

これは素晴らしい質問です。私はかなり考えました。私が学んだ私の教訓を要約します:

  1. MongoDBの代わりにLucene / Solrをほぼすべての状況で簡単に使用できますが、その逆はできません。Grant Ingersollの投稿は、ここで要約しています。

  2. MongoDBなどは、検索やファセット処理の要件がない場合の目的に役立つようです。これは、RDBMSの世界から解毒するプログラマにとって、より単純で間違いなく簡単な移行のようです。Lucene&Solrに慣れていない限り、学習曲線は急になります。

  3. Lucene / Solrをデータストアとして使用する例はそれほど多くありませんが、Guardianはいくつかの進歩を遂げ、これを優れたスライドデッキにまとめていますが、Solrバンドワゴンを完全にジャンプしてSolrを組み合わせて「調査」することについては非コミットです。 CouchDBで。

  4. 最後に、私は私たちの経験を提供しますが、残念ながらビジネスケースについて多くを明らかにすることはできません。私たちは数TBのデータのスケール、ほぼリアルタイムのアプリケーションに取り組んでいます。さまざまな組み合わせを調査した後、Solrを使用することにしました。今まで後悔はありません(6か月&カウント)。他に切り替える理由はありません。

概要:検索要件がない場合、Mongoはシンプルで強力なアプローチを提供します。ただし、検索が提供の鍵である場合は、1つの技術(Solr / Lucene)にこだわり、その中から最適化することをお勧めします。可動部品の数は少なくなります。

私の2セント、それが役に立てば幸いです。


10
Solrにはマップ削減機能はありません。したがって、レポート、統計、スコアの計算などはできません!データをテキストデータとして脅かしている可能性がある場合にのみSolrを使用する
Roland Kofler

8
Solrにはmap-reduceが組み込まれていませんが、Hadoopと組み合わせることができます。architects.dzone.com/articles/solr-hadoop-big-data-love
Mikos

6
Map-reduce noですが、複数のSolrサーバー間でクエリを並行して実行し、それらの結果を集計する機能があります。したがって、汎用のmap-reduceはありませんが、並列検索クエリであるmap-reduceを使用して作成する内容はすでに作成されています。
chubbsondubs 2012年

@Roo:LuceneをメインDBとして使用し、MongoDBで何らかの方法で集約インデックスを作成することはオプションになるでしょうか?それとも意味がありませんか?そしてミコス:素晴らしい答えと現実世界の経験の言及のための+1。
絶望のしかめっ面2013

2
solr6から、並列式によるマップ削減機能をサポート
Divyang Shah

36

Solrでドキュメントを部分的に更新することはできません。ドキュメントを更新するには、すべてのフィールドを再投稿する必要があります。

そしてパフォーマンスが重要です。コミットしないと、solrへの変更は有効になりません。毎回コミットすると、パフォーマンスが低下します。

solrにはトランザクションはありません。

solrにはこれらの欠点があるため、nosqlの方が適している場合があります。


13
MongoDBにもトランザクションはありません。
user183037 2011年

1
SolrまたはLuceneはリアルタイム検索を備えているため、コミットは問題になりません。
mihaicc

1
MongoDBの@ user183037では、ドキュメント内の更新はすべてアトミックです。そして参考までに、Luceneには(あなたの意味で)トランザクションもありません
Aravind Yarram

48
この答えは正しくありません。Solr 4+は部分的な更新をサポートし、ソフトコミット/ほぼリアルタイムで、「旧式の」Solrコミットの問題のほとんどが解消されます。
Mauricio Scheffer 2013年

1
彼らは、MongoDB 4でのトランザクションのサポートを追加しました
Jonas

26

MongoDBとSolrを一緒に使用すると、パフォーマンスが向上します。あなたは私を見つけることができ、ここでブログの記事を、私たちは一緒にこの技術を使用する方法を説明したところ。ここに抜粋があります:

[...]ただし、インデックスサイズが増加すると、Solrのクエリパフォーマンスが低下することがわかります。最善の解決策はSolrとMongo DBの両方を一緒に使用することであることがわかりました。次に、コンテンツをMongoDBに格納し、Solrを使用して全文検索用のインデックスを作成することにより、SolrをMongoDBと統合します。各ドキュメントの一意のIDをSolrインデックスに格納し、Solrで検索した後、MongoDBから実際のコンテンツを取得するだけです。アナライザーやスコアリングなどがないため、MongoDBからのドキュメントの取得はSolrよりも高速です。[...]


3
良いブログ投稿。はい、これは以前のSQLとMySqlデータストアでLuceneを使用した方法とまったく同じです(LuceneにIDを保存し、データストアから複合型を取得します)。技術的には、この質問は2つの違いを調査するためのものでした。「両方の長所」を正確に使用する方法ではありません。+1は、大量のデータを使用する実際の唯一の方法であるため、その方法で使用します。
eduncan911 2012

御返答いただき有難うございます。問題はLuceneではなくNosqlを選択することであることを知っていますが、ここでは、どちらかを選択するのではなく、それらをハイブリッドで使用すると、より良い結果が得られることを示します。
Parvin Gasimzade

2
クエリのパフォーマンスが大幅に低下したため、MongoDBの追加を検討し始めたときのSolrデータベースのサイズ(現在1.5年後)をおおよそ覚えていますか?(10,000ドキュメントまたは10,000,000ドキュメントでしたか?)
KajMagnus 2013

非常に役立ちます。私はGISで作業しているため、この方法でフルテキストと空間検索を組み合わせることができるのは非常に興味深いことです。私たちはすでにMongoDBとPostgresを使用しており、私はしばらくの間Solrについて考えていました。
John Powell 14

2
@ParvinGasimzadeブログ投稿リンクが機能していません。別のリンクまたはソースを提供していただけませんか?
忘却2017年

24

また、一部の人々はSolrにすべてのインデックスを保存し、oplog操作を監視し、関連する更新をSolrにカスケードすることにより、Solr / LuceneをMongoに統合していることに注意してください。

このハイブリッドアプローチを使用すると、フルテキスト検索や高速書き込みなどの機能を備え、信頼性の高いデータストアで書き込み速度を飛躍的に向上させることができるため、両方の利点を最大限に活用できます。

セットアップは少し技術的ですが、solrに統合できるoplogテーラーがたくさんあります。この記事でrangespanが行ったことを確認してください。

http://denormalised.com/home/mongodb-pub-sub-using-the-replication-oplog.html


私が正しく理解していれば、MongoDB(Solrに加えて)を使用する理由は、MongoDBの方が挿入+読み取り速度が速いためです。また、MongoDBの方が信頼性の高いデータストアを持っていることを示しましたか?(または、Solrを参照していましたか?)—最初に何から始めましたか?MongoDBのみ、Solrのみ、またはMongo + Solrの両方ですか?
KajMagnus 2013

12

私の両方の経験から、Mongoはシンプルで簡単な使い方に最適です。私たちが苦しんでいる主なMongoの欠点は、予期しないクエリのパフォーマンスが低いことです(可能なすべてのフィルター/並べ替えの組み合わせに対してmongoインデックスを作成することはできず、単純にできません)。

そしてここLucene / Solrが特にFilterQueryキャッシングで大きな成功を収めているところでは、パフォーマンスは卓越しています。


10

他の誰もそれを言及しなかったので、Solrがスキーマを実施するのに対して、MongoDBはスキーマレスであることを付け加えておきます。したがって、ドキュメントのフィールドが変更される可能性が高い場合、それがSolrよりもMongoDBを選択する理由の1つです。


6
私見はまったく真実ではありません。Solrにはで定義されているスキーマがありますが、schema.xml「動的フィールド」、つまりワイルドカードを介して型が決定されるフィールドもあるので、たとえば*_i整数フィールドとしてインデックス付けされたすべてのフィールドを一致させることができます。文書を追加するとき、あなたは、などの分野conaining文書持つことができcount_ifoo_ibar_iに登場することなく、すべての整数フィールドとして理解されていることをschema.xml文字通りに。かなりスキーマレスだと思います。詳細については、youtube.com / watch?v = WYVM6Wz-XTwをご覧ください。
フロー

私は戻ってこれを+1で引き上げる必要があります。それは真実です。Solrでのスキーマの変更は常に他のデータストアとの同期を保つためにPITAで行われています。
eduncan911 2014年

4
Solrには、スキーマまたはスキーマなしをサポートする機能があります。
Krunal

5

@ mauricio-schefferがSolr 4について言及しました-そのことに興味がある人のために、LucidWorksはSolr 4を「NoSQL検索サーバー」と説明しており、http://www.lucidworks.com/webinar-solr-4-the-nosqlにビデオがあります。 -search-server /では、NoSQL(ish)機能について詳しく説明しています。(-ishは、実際には動的スキーマであるschemalessのバージョン用です。)


1

キーと値の形式を使用してデータを保存するだけの場合は、逆索引がディスク領域を無駄に消費するため、Luceneはお勧めできません。また、ディスクにデータを保存すると、redisはRAMにデータを保存するため、redisなどのNoSQLデータベースよりもパフォーマンスが大幅に低下します。Luceneの最大の利点は、多くのクエリをサポートするため、あいまいなクエリをサポートできることです。


1

mongo op-log tailのようなサードパーティのソリューションは魅力的です。開発/アーキテクチャの観点から、ソリューションを緊密に統合できるかどうかについて、いくつかの考えや質問が残っています。いくつかの理由により、これらの機能の緊密に統合されたソリューションが見られるとは期待していません(多少推測的であり、明確化の対象であり、開発努力が最新ではありません)。

  • mongoはc ++、lucene / solrはjava
    • 多分luceneはいくつかのモンゴライブラリを使用することができます
    • たぶんmongoはいくつかのluceneアルゴリズムを書き直すことができます、以下も参照してください:
  • luceneはさまざまなドキュメント形式をサポートしています
    • mongoはJSON(BSON)に焦点を当てています
  • luceneは不変のドキュメントを使用します
    • 利用可能な場合、単一フィールドの更新が問題になります
  • luceneインデックスは複雑なマージ操作で不変です
  • mongoクエリはJavaScriptです
  • mongoにはテキストアナラ​​イザー/トークナイザー(AFAIK)はありません
  • mongo docのサイズは限られているため、ルセンに関しては穀物に反する可能性があります
  • mongoアグリゲーションopsがluceneに配置されていない可能性があります
    • luceneには、ドキュメント間でフィールドを保存するオプションがありますが、それは同じではありません
    • solrは何らかの形で集計/統計とSQL /グラフクエリを提供します

0

MongoDB Atlasには、luceneベースの検索エンジンがまもなく登場します。今週のMongoDB World 2019カンファレンスで大きな発表がありました。これは、高収益のMongoDB Atlas製品の使用を促進する優れた方法です。

MongoDB Enterpriseバージョン4.2に組み込まれることを期待していましたが、オンプレミス製品ラインに導入されたというニュースはありませんでした。

詳細はこちら:https : //www.mongodb.com/atlas/full-text-search

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.