solr JOIN查询

时间:2010-04-14 10:37:30

标签: join solr

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

人:

<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 个答案:

答案 0 :(得分: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>

使用此架构运行某些主题的查询将返回具有这些主题的所有人。

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

答案 1 :(得分:2)

看起来好的加入实施很快就会到来: https://issues.apache.org/jira/secure/attachment/12465770/SOLR-2272.patch

答案 2 :(得分:0)

如果你不能按照Pascal的建议进行非规范化,你可以编写自己的查询处理程序来进行连接:首先对请求匹配文档的id字段的请求主题发出查询,然后发出包含一个子句的BooleanQuery对于每个id(关于subject = 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