2

solr 4.0 には結合機能があることに気付きました。これを使用してサブドキュメントを結合したいと考えています。

何かのようなもの

<book>
<bookid>1</bookid>
<Title>This book is epic</title>
</book>

<page>
<bookid>1</bookid>
<number>1</number>
<pagecontent>this is the first page of the epic book</pagecontent>
</page>

<page>
<bookid>1</bookid>
<number>2</number>
<pagecontent>this is the second page of the epic book</pagecontent>
</page>

これらのサブドキュメントを結合するにはどうすればよいですか?

これを次のようにクエリしたいと思いますq=text:second . Where text is a copyfield with it in it.

結果は、2 ページ目とその本になります。ブックとページよりも複雑なスキーマがあります。親 id:book を持つ他の種類のサブドキュメントもあります。

Solr 3.6 では、これらすべてのサブドキュメントを複数値フィールドとして格納し、連結フィールドとの組み合わせが存在するかどうかを確認します。これは良い方法ではなく、大量のコーディングが必要です + Java の Strings.contains に依存しています。Solr 4.0の参加が私を助けてくれることを願っています。しかし、正しいクエリを作成する方法と、ページのリストを含む本のような結果を取得する方法がわかりません。

サブドキュメントの種類ごとに複数のインデックスを使用することについても読んだことがありますが、これがドキュメントのスコアリングなどにどのように影響するかはわかりません.

編集:

Solr参加

ここでは、内部クエリの結果のみを最終結果に入れると言います。ID を変更して 2 つのクエリを実行し、結果を結合する必要がありますか? これも気持ち悪い…。

4

1 に答える 1

1

新しい答え: 親の子にインデックスを付け、blockjoin クエリを使用します。ブロック結合情報を見る

以下の答えは古いです。新しい solr バージョンは、プラグインなどを作成する必要なく、blockjoin をサポートします。

solr の queryparserplugin を作成して、lucenequerytimejoin (この結合にはサブドキュメントのスコアリング オプションがあります) を使用しました。

このリンクは、私が行ったことを少し説明しています: Querytimejoin Solr

ここでは、quertimejoin について lucene 開発者の 1 人が説明しています:ブログ QueryTimeJoin

このソリューションは複数のコアをサポートしていません (tr​​unk solr join にはこれがあります)。

于 2013-03-01T11:32:57.673 に答える