solr JOIN查询
我需要在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查询就可以完成这项工作。
任何帮助?
我不认为有可能使用您的模式来做单个查询。
您应该记住的一件事是始终将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>
运行查询,对一些主题与此架构将返回那些具有主题的所有的人。
您可能感兴趣的一些链接:
如果帕斯卡的建议不能进行非规范化,您可以编写自己的查询处理程序做加盟:首先对所请求的主题发出查询,请求匹配文档的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
非常感谢!就我而言,我认为这样做并不是一个真正的选择。我的数据集非常庞大,会有很多匹配的ID会降低性能。我现在正在调查使用SOLR的数据处理器来完成这项工作。将不得不建立一个数据库。 – Sfairas 2010-04-20 13:49:44
它在4.0每晚:) – 2012-01-05 16:02:56
非常感谢帕斯卡。我不知道如何真正改变架构。我们有一些非常大的XML文件可以索引(大约4个),每个文件都有自己的模式,ID有相互连接的ID。使所有这些大XML意味着很多重复和一个巨大的XML文件。我不知道什么更好,性能明智。进行一些额外的查询,或者用一个巨大的xml重复一次。 – Sfairas 2010-04-14 16:32:27
我倾向于说,在大多数情况下,你不应该担心重复,并努力让你的主体完全非规范化。 Lucene指数相当不错。在查询时间,您始终可以使用fl参数来限制要返回给用户的内容。 – 2010-04-14 17:20:05