2013-10-17 23 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,它只是显示的基本步骤)

...是它的浪费,但在实践中的大多数查询的前几页,无论如何,所以并不重要所有这些。它的'深'结果将特别缓慢。