在Sphinx中使用过滤器执行空查询

时间:2013-01-09 08:44:43

标签: php mysql sphinx

我想从没有查询关键字但从其他属性过滤的Sphinx中检索数据。这些其他属性是整数。以下是我们索引的属性:

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

我们的表中有大约3亿个关键字,我们试图通过在Sphinx中使用空查询来解决这个问题(注意:我们使用的是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之外还有更好的解决方案吗?

在我的猜测中,我认为其缓慢的原因是因为Sphinx必须实际遍历所有3亿个关键字才能找到属于过滤器的所有内容。如果指定的查询中有关键字(而不是空查询),则在索引的帮助下,它不必遍历所有关键字,而是跳过不包含关键字的行。如果这是原因,那么除了使用Sphinx之外,必须有更好的方法来解决这个问题。

至于我们的服务器硬件规格:

  • CPU:Intel(R)Xeon(R)CPU E5-2630 0 @ 2.30GHz(8核)
  • 内存:2GB
  • 磁盘空间:250GB

2 个答案:

答案 0 :(得分:2)

Sphinx可以很好地完成这项工作。你的规格有点低(内存),应该稍微提高一点。如果你有3亿行(带有索引),那么MySQL就会占用大量的内存。我会为初学者升级到至少8GB内存。

内存升级后,我会玩Sphinx配置。我首先添加/使用这些选项......

searchd
{
    max_matches         = 200000
    max_filter_values   = 300000
}

max_matches一般会限制总结果的数量,没有理由返回3亿结果。

max_filter_values只是一个完整性检查选项。它会阻止某人选择3亿个标签作为过滤选项。

要搜索空查询,您需要:

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

我可以从经验告诉你,Sphinx绝对足以处理300多万条记录。

大多数情况下,Sphinx没有足够的资源来足够快地访问数据。 “2GB”RAM通过整个系统共享,因此Sphinx实际可用的数量差别很大。我已经看到网络服务器启动并假脱机apache实例,mysql,memcached等 - 只留下100MB的RAM,这远远不是3亿行搜索可以采取imo的数量(还没有完成)基准测试找出实际数字)

修改 此外,您最终还是希望了解Delta : Main索引解决方案。如果您没有多个DB的设置来承担服务器负载,那么当Sphinx进行索引时,它可能会在查询完成之前锁定MySQL。

修改 我遇到了PHP API的一些问题,所以我编译了PHP的Sphinx C扩展,它创造了奇迹,将处理时间缩短了一半。在我最终使用扩展程序之前,我修复了加速一切的API部分。

最重要的2个:     - 注释掉所有“断言” - 这可能不是安全的方式,但断言不属于生产。如果要让断言运行 - 请使用扩展名     - 找到所有“is_int”函数并替换为...

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

对于大型查询,类型转换实际上要快30%。

答案 1 :(得分:0)

感谢您的回复CrazyVipa(我是Ronalds的同事)。

我们的RAM目前只设置为2GB,因为目前没有人在使用我们的网站。通常当我们使用Sphinx时,我们将RAM设置为12-16GB。我们已经跟踪了我们的RAM使用情况,它永远不会超过10GB。

但我们会尝试您的配置和查询建议。

我们明天会回来。