2010-04-14 118 views
1

我需要在solr索引上运行JOIN查询。我有两个xml,我有索引,person.xml和subject.xml。solr JOIN查询

人:

<doc> 
<field name="id">P39126</field> 
<field name="family">Smith</field> 
<field name="given">John</field> 
<field name="subject">S1276</field> 
<field name="subject">S1312</field> 
</doc> 

主题:

<doc> 
<field name="id">S1276</field> 
<field name="topic">Abnormalities, Human</field> 
</doc> 

我只需要从人的文档显示信息,但每个查询应该与两个人,学科领域。在查询只匹配主题文档的情况下,我需要显示具有匹配ID的人员的所有文档。这可能不会运行两个单独的查询吗?像JOIN查询就可以完成这项工作。

任何帮助?

回答

3

我不认为有可能使用您的模式来做单个查询。

您应该记住的一件事是始终将Solr索引视为单个非规格化表。这有时是一个挑战,有时你必须被迫为每种数据使用不同的索引。

对于您的问题,也许有这样一个架构可以帮助:

<doc> 
<field name="id">P39126</field> 
<field name="family">Smith</field> 
<field name="given">John</field> 
<field name="topic">Abnormalities, Human</field> <!-- subject S1276 --> 
<field name="topic">some, other, topics</field> <!-- subject S1312 --> 
</doc> 

运行查询,对一些主题与此架构将返回那些具有主题的所有的人。

您可能感兴趣的一些链接:

+0

非常感谢帕斯卡。我不知道如何真正改变架构。我们有一些非常大的XML文件可以索引(大约4个),每个文件都有自己的模式,ID有相互连接的ID。使所有这些大XML意味着很多重复和一个巨大的XML文件。我不知道什么更好,性能明智。进行一些额外的查询,或者用一个巨大的xml重复一次。 – Sfairas 2010-04-14 16:32:27

+1

我倾向于说,在大多数情况下,你不应该担心重复,并努力让你的主体完全非规范化。 Lucene指数相当不错。在查询时间,您始终可以使用fl参数来限制要返回给用户的内容。 – 2010-04-14 17:20:05

0

如果帕斯卡的建议不能进行非规范化,您可以编写自己的查询处理程序做加盟:首先对所请求的主题发出查询,请求匹配文档的id字段,然后针对每个id(主题= id上的TermQuery)发出一个包含一个子句的布尔查询。如果有大量的id,这将会有相当差的表现,但如果只有少数匹配的id,应该没问题。

如果您预计您的“加入”查询通常会匹配很多(如数百个)主题,那么您可能会更好地按照所建议的进行非规范化。

我不知道从处理程序发出查询的最优雅的方式,但FWIW这里是我怎么做的。

Map args = new HashMap(); 
// add your query parameters to the map, like fields to return 
args.put("fl", new String[]{"id"}); 
final SolrIndexSearcher searcher = req.getSearcher(); 
String query = "your query" 
LocalSolrQueryRequest newReq = new LocalSolrQueryRequest(core, query, "", 0, 0, args) { 
    @Override public SolrIndexSearcher getSearcher() { return searcher; } 
    @Override public void close() { } 
}; 
SolrQueryResponse newRsp = new SolrQueryResponse(); 
core.execute(core.getRequestHandler(newReq.getParams().get(CommonParams.QT)), newReq, newRsp); 
// query results will be in newRsp 
+0

非常感谢!就我而言,我认为这样做并不是一个真正的选择。我的数据集非常庞大,会有很多匹配的ID会降低性能。我现在正在调查使用SOLR的数据处理器来完成这项工作。将不得不建立一个数据库。 – Sfairas 2010-04-20 13:49:44