0

我正在使用 sphinx 将结果返回到自动完成列表。返回时,结果将被缓存在客户端,以避免对服务器造成不必要的命中。

逻辑如下:

  1. 对缓存的结果执行客户端模糊匹配算法并在自动完成中显示
  2. if matches.length < 4 执行 ajax 请求并使用 sphinx 获得更多结果,总共 4
  3. 返回结果并附加到自动完成列表

目前在 ajax 请求中,我正在发送在客户端缓存中匹配的 ID 数组,并使用 PHP 循环遍历 sphinx 的结果并将它们从匹配中删除。

这不仅效率低下,而且在正确限制结果方面当然给我带来了问题。

我想要做的是从 Sphinx 中排除这些特定的 ID 匹配自己,以便限制子句实际上是相关的。

所以问题实际上是,如何使用 PHP api 在 Sphinx 查询中排除某些 ID。例如“查找与用户名 John 的所有匹配项,除非他们具有以下任何 ID....”

我一直在阅读 sphinx 文档,并且已经阅读了大量关于“扩展模式”匹配和使用各种运算符的内容,但是我发现自己非常困惑并且不确定如何继续。

任何帮助将不胜感激。

4

2 回答 2

2

这是使用 sphinx 的好方法:

“目前在 ajax 请求中,我正在发送一组在客户端缓存中匹配的 ID,并使用 PHP 循环遍历 sphinx 的结果并将它们从匹配中删除。”

您需要在 sphinx中使用setfilter

$cl->SetFilter ( $attribute, $values, $exclude=false );

这里 $cl 是 sphinx 类的对象

$attribute 是要应用过滤器的属性名称。

$values 必须是一个包含整数值的普通数组。(在这里你可以传递你的数组)

exclude 这是非常重要的参数,如果您想从数组(第三个参数)中提供的结果中排除所有 id,则将其设置为 true。

例如:$cl->SetFilter ($attribute, $values, true);

希望这有帮助!!

于 2012-10-15T09:50:09.303 回答
2
$cl->setFilter("id",array(12,45,34,67,34),TRUE);

:)

于 2012-10-15T09:50:41.877 回答