我想从没有查询关键字但从其他属性过滤的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之外,必须有更好的方法来解决这个问题。
至于我们的服务器硬件规格:
答案 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。
但我们会尝试您的配置和查询建议。
我们明天会回来。