2012-05-03 21 views
2

私はMongoDBを使って、どんな素晴らしい機能があるかを見ています。私は、簡単なブログシステムを表す小さなテストスイートを作成しました。投稿、投稿、コメントはとても基本的です。MongoDBの全文検索と逆インデックス

MongoRegExクラス(PHPドライバ)を使った検索機能を試したところ、 "lorem ipsum"の後にすべての投稿コンテンツと投稿タイトルを検索しています。 。

$regex = new MongoRegEx('/lorem ipsum/i'); 
$query = array('post' => $regex, 'post_title' => $regex); 

しかし、私は混乱していると何が起こるかについては唖然:

私のコードは次のようになります。私は実行時間のすべてのクエリをチェックします(質問の前と後の微小時間を設定し、15小数で時間を取得します)。

私の最初のテストでは、ランダムに生成された110,000のブログ文書と5000人の著者を追加しました。検索を行うと、「lorem ipsum」という文章を含む6824件の記事が検索され、検索には0.000057935714722秒かかります。そして、の後に私はMongoDBサービス(Windowsを使用して)をリセットしました。これは、_idのデフォルト以外のインデックスがありません。

MongoDBはBツリーインデックスを使用します。これは、フルテキスト検索ではあまり効率的ではありません。投稿コンテンツの属性にインデックスを作成すると、上記と同じクエリが0.000150918960571で実行されます。これは、インデックスがない場合(0.000092983245849の係数ではより遅い)よりも遅いです。これは、Bツリーカーソルを使用するため、いくつかの理由で起こります。

しかし、私はどのように速くそれを照会することができるかについての説明を検索しようとしました。私はおそらく私のRAMにすべてを保持すると思う(私は4GBを持っているとデータベースは約500MBです)。このため、mongodbサービスを再起動して完全な結果を得ようとしています。

MongoDBを経験したことがある人は、インデックスの有無にかかわらずこのようなフルテキスト検索で何が起こっているのか理解しやすくなりますか?

敬具 - Mestika

+0

見たことがない場合:http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo –

+1

mongodb regexは "starts with"タイプの正規表現でない限りインデックスを使用しません - 私は、すべての用語を配列に分解し、それを指標にしていくつかの成功を収めました。私はそのソリューションをElastic Search(全文検索部分)に移行する予定で、他の種類のクエリのためにすべてをmongoに保存します。はい、それはアクセスされ、空きメモリがある場合は、RAMにあなたのデータを保持します。 –

答えて

4

私はあなたが単に結果を反復処理していなかったと思いますか? find()だけでは、ドライバはではなく、はサーバにクエリを送信します。少なくとも1つの結果を取得する必要があります。私はMongoDBがこれほど高速だとは信じません。私はあなたのエラーがあなたのベンチマークにあると信じています。二つ目として

は、^とフィールドの値の先頭に固定さないで正規表現検索のために、何のインデックスがまったく使用されません。実際に何が起こっているか見るには、explain()で遊ぶべきです。