2013-10-17 53 views
0

我們有一個很大的索引,大約有10億個文檔。我們的應用程序不允許用戶搜索所有內容。他們有訂閱,他們應該只能在其中搜索。 我們對指數的第一次迭代中使用的屬性,因此,典型的查詢看上去像這樣(我們使用PHP API):具有大量屬性的獅身人面像查詢

$cl->SetFilter('category_id', $category_ids); // array with all user subscriptions 
$result = $cl->Query($term,"documents"); 

這工作沒有問題,但速度很慢。然後我們看到這個article。與未索引的MySQL查詢類似是令人震驚的,我們決定放棄基於屬性的過濾器並嘗試使用全文列。所以現在,我們的category_id是一個full_text列。事實上,我們最初的測試表明,搜索速度要快很多,但是當我們將索引投入生產時,我們遇到了一個問題。有些用戶有很多的訂閱,我們開始從獅身人面像收到此錯誤:

Error: index documents: query too complex, not enough stack (thread_stack_size=337K or higher required) 

我們新的查詢是這樣的:

user_input @category_id c545|c547|c549|c556|c568|c574|c577|c685... 

當有太多的類別上面的錯誤出現。我們認爲只要將thread_stack提高到更高的值就可以很容易地解決問題,但事實證明它只限於2MB,而且我們仍然有超過這個問題的查詢。

問題是現在要做什麼?我們正在考慮將查詢分解爲更小的查詢,但是我們如何將結果與正確的限制進行彙總(我們正在使用$ cl-> SetLimits($ page,$ limit);用於分頁)?

任何想法都會受到歡迎。

回答

0

你可以在應用程序中執行'分頁',這就是獅身人面像在查詢分佈式索引時如何合併。

$upper_limit = ($page_number*$page_size)+1; 
$cl->setLimits(0,$upper_limit); 
foreach ($indexes as $index) { 
    $cl->addQuery(...); 
} 
$cl->RunQueries() 
$all = array; 
foreach ($results) { 
    foreach (result->matches) { 
     $all[$id] = $match['weight']; 
    } 
} 
asort($all); 
$results = array_slice($all,$page,$page_size) 

(我知道它不是完全有效的PHP,它只是顯示的基本步驟)

...是它的浪費,但在實踐中的大多數查詢的前幾頁,無論如何,所以並不重要所有這些。它的'深'結果將特別緩慢。