2011-12-27 37 views
3

私はアイテム(Web文書など)を保管するアプリケーションを持っています。各アイテムには、任意の大きなタグセットがあります。典型的な共通クエリは、指定されたタグのセットを持つすべてのドキュメントを取得することです。さて、かなり一般的なWebアプリケーションです。NoSQL:索引付けとキーワードベースの検索

ここでは、永続ストレージとしてNoSQLデータベースを考えています。様々なNoSQLシステム(例えば、MongoDB)は、二次索引およびそのキーワードベース検索をサポートする。さまざまなシステムでそれを行う方法を示す例は、簡単に見つけることができます。問題は、どのように二次インデックスがどのように/どこに格納されているのか、タグのリストを含むクエリが実際にどのように実行されるのかを知りたいということです。特に、ノードが多いシステムでは

私はMap/Reduceなどのソリューションを知っています。しかしここで私はインデックス作成の仕組みに興味があります。例えば、私が持っている質問は次のとおりです:

  • 2次インデックスはアイテム/オブジェクトID以上しか保存しませんか?
  • クエリにk個のタグが含まれている場合、k個のサブクエリ(各タグに1つずつ)が実行され、k個の部分結果が開始ノードに結合されますか?

異なるNoSQLシステムでこのような情報はどこにありますか?どんなヒントでもありがとう。データベースは、配列の各要素に対して文書を一致させようとれるのMongoDBのタグのインデックスは、マルチキーを利用して行われることになる

クリスチャン

答えて

2

特徴。指定されたドキュメントのこのタグ属性にインデックスを付けると、その配列内のタグの範囲から構成されたbtreeが作成されます。あなたはmultikeys hereについての詳細を学ぶことができるし、このプレゼンテーションを見てMongoDBの中のインデックスに関する詳細情報を入手することができます

MongoDB Internals

セカンダリインデックスは唯一のアイテム/オブジェクトIDまたはそれ以上を保管していますか?

インデックスは、インデックス付きフィールド(あなたの場合はタグ配列、次にフィールドは単一のタグ)と、メモリ内のドキュメントの効率的な配置に使用されるオフセットで構成されます。またhere

を説明したように、クエリは、k個のタグが含まれている場合、いくつかのパディング+他のオーバーヘッドを有するk個のサブクエリである - 各タグについて1つ - 実行及びk部分的な結果は、一つ開始ノードに結合され?

しかし、たとえば、クエリが$またはタグフィールドを使用していた場合、クエリはO(log n)時間でそれぞれ並列に実行され、結果はフォームに結合されます結果セットが、私はこれについて確信が持てません。

+1

こんにちはタイラー、あなたの返信とリンクをありがとう。プレゼンテーションは確かに面白かったですが、多分内部が少しだったかもしれません。私が今見出したのは、少なくとも(少なくとも)MongoDBが索引、つまり各ノード/シャード/に文書ベースのパーティションを適用しているということです。独自のローカルインデックスを維持しています。次に、マルチアイテムクエリがすべての(?)ノードに送信され、ローカルで処理されます。 (私の第2の質問に記載されている代わりの方法は、グローバルインデックス、すなわちインデックスの用語ベースの分割にむしろ適用される)。あなたの助けにもう一度感謝、キリスト教徒 – Christian

関連する問題