2012-04-02 10 views
9

文書の代わりにLuceneインデックスに格納する必要がある小さな木があります。それをどうやって行うのですか?Lucene/Solr/ElasticsearchインデックスまたはNoSQLデータベースにツリーデータを格納する方法は?

ツリーの例ノード:

class Node 
{ 
    String data; 
    String type; 
    List<Node> children; 
} 

上記ノードにおいては、「データ」のメンバ変数は、フルテキスト検索する必要があるので、単語のスペースで区切られた文字列です。 "type"メンバ変数は単なる単語です。

検索クエリはツリー自体であり、各ノードのデータとタイプの両方、および一致するツリーの構造を検索します。子ノードと照合する前に、照会はまず親ノードのデータと型に一致しなければなりません。データ値におおよそのマッチングが可能です。

この種のデータのインデックスを作成するには、どのような方法が最適ですか? Luceneがこれらのデータのインデックス作成を直接サポートしていない場合、これはSolrまたはElasticsearchによって行うことができますか?

私はneo4jをすばやく見ましたが、小さなツリー構造の大きなコレクション(数十億または数兆ドル)ではなく、グラフ全体がデータベースに格納されているようです。または私の理解は間違っていた?

また、非LuceneベースのNoSQLソリューションがこれに適していますか?

+0

何あなたが検索時に見つけるために探しています。 NodeBをNodeAの子として持ち、NodeBにFOOというテキストがある場合、FOOを検索するときは、NodeBまたはNodeAを返しますか? – sbridges

+0

クエリはツリー構造とツリーデータと照合されます。したがって、NodeAのデータがすでに一致している場合、NodeBのFOOの発生は完全一致となります。 –

+0

あなたはFOOがNodeAとNodeBになければならないと言っていますか?または、そのタイプはNodeAで一致する必要がありますが、タイプがNodeBで一致するかどうかは関係ありません。 – sbridges

答えて

8

別のアプローチは、ツリー内の現在のノードの位置の表示を格納することです。例えば、14番目のツリーの1番目の第1レベルノードの3番目の2レベルノードの17番目のリーフは014.001.003.017と表される。

'treepath'がツリーの場所のフィールド名であると仮定すると、 'treepath:014 *'をクエリして、14番目のツリー内のすべてのノードとリーフを検索します。同様に、14番目のツリーの子をすべて見つけるには、 'treepath:014. *'というクエリを実行します。

このアプローチの主な問題点は、ブランチを移動すると、移動したブランチの後にすべてのブランチを並べ替える必要があることです。あなたの木が比較的静的であるならば、それは実際には小さな問題でしかないかもしれません。

この要件やソリューションがここに捕獲され

+0

ありがとうございました!これを解決するために私が従ったアプローチが正確です。 –

+0

こんにちは@GolamKawsar、このアプローチは各レベルの階層を集約するのにも役立ちましたか? –

2

Neo4jをお勧めします。 ツリーは、結局のところ、特別な拘束グラフです。

チェックアウトあなたがのNeo4jのツリーを保存する必要があるかどうかで、この偉大な議論:

http://www.mail-archive.com/[email protected]/msg03256.html

+0

あなたの答えをありがとうが、リンクが壊れています。また、Neo4jは数十億(または何兆)もの小さな木をインデックスに登録できますか?ノードに格納されている構造とテキストを含むツリーを検索できるようにしたい。 –

+0

リンクが壊れていない、私はちょうどチェックした。 –

+0

ここでは、そのディスカッションスレッドを見つけることができますいくつかのより多くの場所は次のとおりです。http://lists.neo4j.org/pipermail/user/2010-April/003313.html http://neo4j.org/nabble/#nabble-td700300 –

3

(私はこのアプローチはいずれかの「パスの列挙」や「デューイ十進」表現と呼ばれる見てきました。):Proposal for nested docs

このデザインでしたその後LuceneとElastic Searchの両方で実装されました。 BlockJoinQueryは、ここに概説されているような実装を持っているコアのLucene実装と弾性検索ルックです:「徹底的な」木を扱うプロジェクトサイレンhttp://rdelbru.github.io/SIREn 、アドレッシングがElastic search nested docs

+0

ES/Luceneのネイティブソリューションは、「ハッキー」ソリューションより優れています! –

関連する問題