2012-04-05 111 views
0

我正在嘗試使用Sphinx搜索不同字段的多個MySQL表,並將所有結果組合到基於相關性的單個集合中。Sphinx使用PHP API搜索多個表和聚合結果

我已經爲每個表配置了Sphinx索引,並且通過一次搜索所有索引成功組合了結果。

當我通過shell使用SEARCH來查詢時,我得到了所有的結果信息。但是,當我使用PHP API時,結果只會返回行的ID,因此無法分辨它來自哪個表。

有沒有辦法讓PHP API告訴我它來自哪個表/索引,以便我可以進入並查詢實際數據?

我正在考慮的替代方法是嘗試處理來自shell腳本的輸出,但似乎很混亂。

這是PHP: $ search = $ _GET ['query']; //連接信息 $ sphinxClient = new SphinxClient(); $ sphinxClient-> SetServer('localhost',9312); $ sphinxClient-> SetMaxQueryTime(5000);

//Sphinx Result Configuration 
$sphinxClient->SetMatchMode(SPH_MATCH_ANY); 
$sphinxClient->SetRankingMode(SPH_RANK_PROXIMITY_BM25); 
$sphinxClient->SetLimits(0, 20); 

// Give me back the results as an array 
$sphinxClient->SetArrayResult(true); 

$searchResults = $sphinxClient->Query($search, 'user model'); 

shell腳本很簡單:

./search SEARCHTERM 

其中SEARCHTERM是輸出的東西看起來搜索

,如:

獅身人面像2.0.3 - 釋放(r3043) Copyright(c)2001-2011,Andrew Aksyonoff Sphinx Technologies Inc(http://sphinxsearch.com)版權所有(c)2008-2011

使用配置文件'/ usr/local/sphinx/etc/sphinx的.conf '... 索引 '用戶':查詢' 牛頓的「:返回10總在0.000秒

顯示比賽的10個匹配: 1.文檔= 1,權重= 2629,時間=星期四00年1月1日:33:32 1970 ID = 1 如first_name =喬 姓氏= Shmo 公司= Acme公司

JSON格式的PHP API輸出: { 「錯誤」: 「」, 「警告」: 「」, 「狀態」: 「好」, 「田」: 「名字」, 「CODE_NAME」 「代碼」, 「說明」, 「等級」, 「角度」, 「發佈」, 「key_words」, 「referenced_num」, 「批准」, 「used_num」, 「avg_runtime」, 「例子」, 「編輯」,」 attrs「:{」time「:2}, 」matches「: [ {」id「:1,」weight「:」1「,」attrs「:{」time「 }} ], 「total」:「1」, 「total_found」:「1」, 「time」:「0。000「, 」words「:{」posuere「:{」docs「:」1「,」hits「:」2「}} }

+1

請添加在您執行PHP API搜索代碼,以便它的更清楚你如何做到這一點。接下來,請記錄您所做的shell命令行,以便可以相互比較。 – hakre 2012-04-05 08:10:17

+0

./search搜索shell腳本不是爲生產使用而開發的。它是調試和監視索引狀態和內容的工具。您應該使用Sphinx API。 – 2012-04-05 11:22:13

回答

1

這是正常的,獅身人面像將返回對象(行)的ID。問題出在你的模型上。如果您無法確定它是哪個對象,那麼您的模型是錯誤的。 可能的選項是:

  • 創建每對象類型(表或一組鏈接的表的)
  • 提高你的對象記數以使可能的對象識別,通過一些前綴例如一個單獨的索引斯芬克斯。
3

我很確定, T單獨獲取的ID匹配的文件,但也發現了文檔中的所有其他INT值。

所以你可以嘗試添加在你的源像

SELECT id, "1" as type FROM table1 

sql_attr_uint = type 

type字段現在告訴你哪個表ID是從

請否但是,一次搜索不同表格的多個索引時會遇到一些問題。

  1. 您需要確保該ID不會在結果集中出現多於一次(通常建議的解決辦法是墊的ID乘以1000000或一些類似的方式 - 這我個人覺得可怕)

  2. 結果僅包含正在搜索的第一個索引的列。您需要確保所有源代碼都返回相同的列。

每個個人我想一次搜索多個索引的時候,我結束了單獨搜索每一個和呈現結果本身。

更新:增加了sql_attr_uint需要

+0

感謝您的回覆,它非常有幫助。如何填充id值以確保唯一性?在SQL查詢本身?另外,你能解釋第二部分嗎?我從上面發佈的API獲得的輸出不會返回任何列的值,所以我認爲這不是問題。 – 2012-04-05 08:37:36

+0

@BrianPeacock,發佈你的Sources定義,我會回答你 – mobius 2012-04-05 08:55:26

0

如果表中有你可以使用工會與SQL相同的結構查詢

SELECT * FROM table1 WHERE id IN (ids,from,sphinx) 
UNION 
SELECT * FROM table2 WHERE id IN (ids,from,sphinx) 
... 
UNION 
SELECT * FROM tableN WHERE id IN (ids,from,sphinx) 

提防,這是CPU密集型