2011-11-29 54 views
0

我正在嘗試編寫一個查詢,該查詢從兩個SphinxSE表中加入MySQL的一些表。它基本上是一個「每行都有兩個名字」的類型數據庫,而這兩個名字每個都是一個鏈接到SphinxSE表的索引...我的目標是做一個基本上「或者其中一個名字匹配這個字符串的搜索在獅身人面像「。在單個查詢中加入多個SphinxSE表

我已經嘗試使用該查詢:

SELECT * from names 
LEFT JOIN name_1_se ON name_1_se.id=names.name_1_id 
LEFT JOIN name_2_se ON name_2_se.id=names.name_2_id 
WHERE name_1_se.query=('some random name;mode=phrase;limit=100000;maxmatches=100000') 
OR name_2_se.query=('some random name;mode=phrase;limit=100000;maxmatches=100000') 

(該name_1_se和name_2_se表是與SphinxSE表)。

如果我在where中只使用單個查找,它可以正常工作......添加第二個子句(任一個)強制兩個SphinxSE「查找」強制結果返回空。

正在嘗試做什麼,或者它是SphinxSE的已知問題?我在斯芬克斯網站上找到的最接近的是自2008年起的這個錯誤http://sphinxsearch.com/bugs/view.php?id=255

謝謝!

回答

2

沒有這個不行。這是因爲sphinxSE/mysql的'artitecture'。

獅身人面像當然不會呈現真正的表到MySQL。它假裝它的一張桌子。它通過索引告訴mysql查詢優化器工作得很好。所以優化器應該總是選擇SphinxSE表'first',然後再與真正的mysql表連接。

因此,對於每一行,它在SphinxSE表上進行索引掃描,從而獲得doc_ids。然後它在原始表(聯接本身)中查找它們。

SphinxSE不能存在於Join的'右'側。總是必須先(或左)。

...您的查詢(使用左連接)迫使MySQL將sphinxSE表(不會少於!)放在右側,這樣做不會工作。


您需要將查詢重新構造爲一個單一的sphinxSE表。 sphinxSE表可以一次搜索多個獅身人面像索引。或者也許可以改革你的實際指標,使一次索引。

記住可以是每個索引多個字段 - 這樣的擴展查詢也許可以用

(@字段1「一些隨機名稱」)| (@ field2「一些隨機名稱」)

...結果一個sphinxSE表(在連接:)左邊)。


更新補充:

創建與SphinxSE一次搜索兩項指標(如SQL UNION)敢肯定,你可以做

CREATE TABLE ... CONNECTION="sphinx://localhost:9312/index1,index2"; 

但即使你不能,覆蓋它在查詢的時間應該肯定工作,例如從文檔:

... WHERE query='test;index=test1,test2,test3;'; 

定義在該表將被忽略,所以可以使用任何sphinxSE表。

+0

順便說一句,即使您在連接的右側指定了SphinxSE,查詢優化器也應該先將其翻轉並放置。它不能做兩個左連接。檢查EXPLAIN輸出。 – barryhunter

+0

謝謝barryhunter:這是很多很好的信息。關於你在哪裏說的一個問題「sphinxSE表可以一次搜索多個獅身人面像索引」......我該怎麼做?當我在MySQL中定義SphinxSE表時,我必須將它指向一個特定的索引:我如何將它指向多個索引? – Narcissus

+0

更新了答案,以顯示如何創建這樣的表。 – barryhunter