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 一样查询这个,其中包含所有其他字段。

结果应该是第二页和它的书。我有一个更复杂的架构,然后只是书本和页面。还有其他类型的子文档具有父 id:book。

在 Solr 3.6 中,我将所有这些子文档存储为多值字段,并检查组合是否与连接字段一起存在。这不是一个好方法,需要大量编码 + 它依赖于 Java 的 Strings.contains。我希望solr 4.0加入可以帮助我。但我不明白如何编写正确的查询以及如何检索带有页面列表的书之类的结果。

我还阅读了有关为每个子文档类型使用多个索引的信息,但我不知道这将如何影响文档评分等。

编辑:

Solr 加入

在这里他们说他们只将内部查询的结果放入最终结果中。我是否应该更改 id 进行 2 次查询,然后合并结果?这对我来说也很糟糕......

4

1 回答 1

1

新答案:索引父子并使用块连接查询。查看区块连接信息

下面的答案是旧的。新的 solr 版本支持 blockjoin,无需编写插件等。

我通过为 solr 制作 queryparserplugin 来使用 lucenequerytimejoin(此连接在子文档上有评分选项)。

这个链接解释了我所做的一点:Querytimejoin Solr

在这里,一位 lucene 开发人员解释了 quertimejoin:Blog QueryTimeJoin

此方案不支持多核。(trunk solr join 有这个)。

于 2013-03-01T11:32:57.673 回答