2010-04-14 147 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