2013-01-09 39 views
1

我想從Sphinx中檢索數據而不使用查詢關鍵字,但使用其他屬性的過濾器。這些其他屬性是整數。以下是我們索引的屬性:在Sphinx中使用過濾器執行空查詢

id - Integer 
keyword - String 
keyword_ord - Integer 
words - Integer 
results - Integer 

我們在我們的餐桌大約有300萬個關鍵字,我們試圖通過在獅身人面像使用空查詢來解決這個問題(注:我們正在使用PHP和MySQL)。假設我們想要得到其中有3到6個單詞的關鍵字和那些有3000到10000個結果的關鍵字,那麼我們在PHP中使用Sphinx API的SetFilterRange()函數。

$sphinx->SetFilterRange('words', 3, 6); 
$sphinx->SetFilterRange('results', 3000, 10000); 

然後執行搜索,我們發送一個空的查詢。

$results = $sphinx->query(''); 

問題是查詢看起來仍然比我們預期的要慢。您是否認爲有更好的方法可以通過過濾器獲取數據,而不是在Sphinx中發送空查詢?或者,除了獅身人面像之外,還有更好的解決方案嗎?

在我的猜測中,我認爲它很慢的原因是因爲Sphinx必須實際循環遍歷所有3億個關鍵字來查找過濾器下的所有內容。如果指定的查詢中存在關鍵字(而不是空查詢),那麼在索引的幫助下,不必遍歷所有關鍵字,而是跳過不包含關鍵字的行。如果這是原因,那麼除了使用獅身人面像之外,還有一個更好的方法來解決這個問題。

至於我們的服務器硬件規格:

  • CPU:英特爾(R)至強(R)CPU E5-2630 0 @ 2.30GHz(8芯)
  • 內存:2GB
  • 磁盤空間:250GB
+0

我剛剛編譯了C的Sphinx Extension for PHP,這對於大型查詢來說非常棒 - 將處理時間縮短了一半。 http://pecl.php.net/package/sphinx(檢查我的編輯也爲更多的api「修復」) – CrazyVipa

回答

2

獅身人面像可以很好地完成這項工作。你的規格有點低(內存),應該稍微提高一點。如果你有3億行(有索引),單單MySQL就會佔用大量內存。我會爲初學者升級至少8GB內存。

內存升級後,我會玩弄獅身人面像配置。我想通過添加/使用這些選項啓動...

searchd 
{ 
    max_matches   = 200000 
    max_filter_values = 300000 
} 

max_matches將限制總成績的量一般,無理由退貨300萬個結果。

max_filter_values只是一個完整性檢查選項。它會阻止某人選擇3億個標籤作爲過濾選項。

要搜索一個空的查詢,您需要:

$results = $sphinx->query('*'); 

我可以從經驗中獅身人面像絕對夠強大,可以處理300多萬條記錄告訴你。

大多數時候,斯芬克斯只是沒有足夠的資源來訪問數據足夠快。通過整個系統共享「2GB」內存,所以實際上獅身人面像可用的數量差別很大。我已經看到網絡服務器啓動並將apache實例,mysql,memcached等緩存起來 - 只剩下100MB的RAM,這遠遠不及3億行搜索可能需要的量(還沒有完成臺架測試,找出實際人數)

編輯 此外,你最終要考慮的Delta : Main索引的解決方案。如果您沒有多個數據庫的設置來承擔服務器負載,那麼當Sphinx索引時,它可能會最終鎖定MySQL,直到查詢完成。

編輯 我已經遇到了一些與PHP API的一個問題是什麼,所以我編譯獅身人面像C擴展PHP和已經創造了奇蹟,切削加工時間縮短了一半。在我最終使用擴展之前,我修復了API的部分功能,以加快速度。

2最重要的: - 註釋掉所有「斷言」 - 這可能不是安全的方式,但斷言不屬於生產。如果你想擁有的斷言運行 - 使用擴展 - 找到所有「is_int」功能,取而代之的...

if ((int)$v === $v) { 
/* code here */ 
} 

的類型轉換實際上是有很大疑問快約30%。

+0

我們嘗試了你所建議的一切,但它並沒有真正有所作爲。我們嘗試了*星號查詢,但它產生了一個錯誤。所以我們堅持使用空的查詢。我們試圖將內存提高到12GB,儘管它稍微加快了一些,但它仍然不是我們期待的速度。有沒有其他方法你知道?也許不使用獅身人面像? –

0

感謝您的回覆CrazyVipa(我是Ronalds的同事)。

我們的RAM目前僅設置爲2GB,因爲目前沒有人使用我們的網站。通常當我們使用Sphinx時,我們將RAM設置爲12-16GB。我們追蹤了我們的RAM使用情況,從未超過10GB。

但我們會嘗試您的配置和查詢建議。

明天我們會回到這裏。