如何使用solr的join

2021-09-02 02:59:27 字數 4720 閱讀 1251

[b][color=olive][size=large]對於用慣資料庫的我們,多表進行join連線,是非常常見的乙個需求,但是在我們的索引中,對join的支援,卻不是很完美,當然這並不是由於我們的lucene或solr不夠強大,而是全文檢索與資料庫的定位不是在同乙個目標上,全文檢索,主要定位在搜尋引擎上,通常是對乙個大的索引進行高效檢索,而資料庫則是定位在結構化資料的儲存於與檢索,檢索功能比較薄弱,那我們的索引是不是就不支援join了,實事並非如此,lucene裡面支援join操作,這種join定位在同乙份索引裡,而solr作為lucene的擴充套件,又提供了兩core join的功能,下面散仙給出乙個例子,盡量簡單,清晰的描述出如何使用它們和理解它們的工作方式。

[/size][/color][/b]

[b][color=green][size=large]散仙,有2個core,分別是collection1,和collection2,裡面的資料分別是:

collection1:總共有3條資料

collection1:schema 都是字串string ; 有id,name兩個字段 ;

collection2:總共有5條資料

collection2:schema 都是字串string ;有id,name,brand_id 兩個字段;

collection2: , , , ,

下面,先來看下單core的join,以collection2作為例子,測試**如下:

[/size][/color][/b]

/***

* join測試

* *

* ***/

public static void joinquery2()throws exceptionbrand_id:*");

queryresponse qr=server1.query(sq, method.post);

solrdocumentlist list=qr.getresults();

system.out.println("命中結果集:"+qr.getresults().size());

for(solrdocument s:list)

}

[b][color=olive][size=large]執行結果如下:[/size][/color][/b]

五月 14, 2014 9:03:58 下午 org.apache.solr.client.solrj.impl.httpclientutil createclient

命中結果集:5

solrdocument

solrdocument

solrdocument

solrdocument

solrdocument

[b][color=green]改變,條件後,再測:[/color][/b]

/***

* join測試

* *

* ***/

public static void joinquery2()throws exceptionbrand_id:2");

queryresponse qr=server1.query(sq, method.post);

solrdocumentlist list=qr.getresults();

system.out.println("命中結果集:"+qr.getresults().size());

for(solrdocument s:list)

}

[b][color=olive][size=large]執行結果如下:[/size][/color][/b]

五月 14, 2014 9:10:04 下午 org.apache.solr.client.solrj.impl.httpclientutil createclient

命中結果集:1

solrdocument

[size=large][color=olive]分析執行原理,類似sql中的寫法:

select *

from collection1

where brand_id in (select id from collection1 where brand_id = * )

第一步,先執行子查詢select id from collection1 where brand_id = *

會返回所有的id分別是,1,2,3,4,5

第二步,執行主查詢就是

select *

from collection1

where brand_id in (1,2,3,4,5)

而brand_id去重完之後,就只有1,2,3了,所以轉換成如下查詢:

select *

from collection1

where brand_id(1,2,3) in (1,2,3,4,5)

取並集後結果,就會命中brand_id=1,2,3的文件,所以就命中了所有的文件

再來分析下,第二個查詢,指定查詢id的join:

第一步,先執行子查詢select id from collection1 where brand_id = 2

會返回所有的id分別是,3,4,

第二步,執行主查詢就是

select *

from collection1

where brand_id in (3,4)

而brand_id去重完之後,就只有1,2,3了,所以轉換成如下查詢:

select *

from collection1

where brand_id(1,2,3) in brand_id(3,4)

取並集後的結果,就會命中brand_id=3的文件了,所以就會返回id為5的文件;

[/color][/size]

[color=olive][size=large]下面,來測下,兩個core的join,**如下:[/size][/color]

/***

* join測試

* *

* ***/

public static void joinquery2()throws exceptionname:ipad");

queryresponse qr=server1.query(sq, method.post);

solrdocumentlist list=qr.getresults();

system.out.println("命中結果集:"+qr.getresults().size());

for(solrdocument s:list)

}

[color=green][size=large]結果如下:[/size][/color]

[color=olive][size=large]分析類似如下sql:

select b.* from collection1 b

inner join collection2 p on b.id=p.brand_id

where p.name="ipad";

注意collection名的先後順序,如上solrj裡面的執行,跟上面的sql的執行規則是一樣的,所以我們最終的結果裡,會返回,如果我們的條件是下面的相反組合:

[/size][/color]

public static void joinquery()throws exceptionid:1");

queryresponse qr=server1.query(sq, method.post);

solrdocumentlist list=qr.getresults();

system.out.println("命中結果集:"+qr.getresults().size());

for(solrdocument s:list)

[color=olive][size=large]則執行結果如下所示:[/size][/color]

五月 14, 2014 9:43:46 下午 org.apache.solr.client.solrj.impl.httpclientutil createclient

命中結果集:2

solrdocument

solrdocument

[color=olive][size=large]原理,依舊與如上的sql一樣。只不過位置相反,調整了:

select b.* from collection2 b

inner join collection1 p on b.id=p.brand_id

where b.id=1;

[/size][/color]

solr的join的用法

join的真正用法舉例 a core是電影表,欄位是電影id,導演id b core是導演表,裡面包括導演id,導演名字,欄位是 現在搜一下叫 張三 的導演的所有電影 則需要在a core裡進行搜尋 name 張三 但現在有些問題,solr主要作用是搜尋,而不是關係型資料庫,所以返回值裡依然只有a ...

Solr關聯查詢 join 用法

在solr的使用中,有時候會過濾一些資訊,在這個時候就需要使用到solr的 join 關鍵字,下面舉例說明 content field 查詢的意思是將content欄位中包含 field 的查詢出來並返回linkedid 然後在返回的所有內容中 查詢id在返回的linkedid中的內容。實際上等同於...

使用Join代替In

我們知道,在sql中使用in讓我們的where子句可以規定多個值。當需要從乙個集合中查詢包含某幾個值的記錄的時候,通常我們會選擇使用in來實現,其實,使用join也可以實現這樣的功能,而且效能要比in好。我會從以下幾個方面來進行總結。使用in和join的效能對比 ef中如何使用join來代替in 首...