1

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

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

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

2 回答 2

2

狮身人面像可以诚实地完成这项工作。您的规格有点低(内存),应该提高一点。如果您有 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”内存,因此 Sphinx 实际可用的内存可能会有很大差异。我已经看到 Web 服务器启动并启动 apache 实例、mysql、memcached 等——只剩下 100MB 的 RAM,这与 imo 进行 3 亿行搜索所需的数量相去甚远(还没有完成台架测试以找出实际数字)

编辑 另外,您最终会想要研究Delta : Main indexing 解决方案。如果您没有多个数据库设置来承担服务器负载,那么当 Sphinx 索引时,它可能最终会锁定 MySQL,直到查询完成。

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

最重要的 2 个: -- 注释掉所有“断言” -- 这可能不是安全的方法,但断言无论如何都不属于生产。如果你想让断言运行——使用扩展——查找所有“is_int”函数并替换为...

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

大型查询的类型转换实际上快了大约 30%。

于 2013-01-09T15:36:32.970 回答
0

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

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

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

我们明天会回到这里。

于 2013-01-09T16:05:54.920 回答