Solr 4.0如何加入子文档

时间:2012-12-14 15:50:54

标签: java solr solrj

我注意到solr 4.0有一个join函数,我想用它来连接子文档。

这样的东西
<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 .一样查询 其中text是包含其中所有其他字段的copyfield。

结果应该是第二页及其书。我有一个更复杂的架构,然后只是预订和页面。还有其他类型的父文件ID:book。

的子文档

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

我还读过关于为每个子类型使用多个索引但我不知道这会如何影响文档评分等。

编辑:

Solr join

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

1 个答案:

答案 0 :(得分:0)

新答案:索引父子并使用blockjoin查询。见blockjoin info

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

我已经使用了lucenequerytimejoin(这个连接在子文档上有评分选项),为solr创建了一个queryparserplugin。

此链接解释了我所做的一切:Querytimejoin Solr

这里的quertimejoin由一个lucene开发者解释:Blog QueryTimeJoin

此解决方案不支持多核。(trunk solr join具有此功能)。