如何在匹配时让狮身人面像忽略某些ID?

时间:2012-10-15 09:43:07

标签: php sphinx

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

逻辑如下:

  1. 对缓存的结果执行客户端模糊匹配算法并显示在自动完成
  2. if matches.length< 4执行ajax请求并使用sphinx获得更多结果,最多可达4个
  3. 返回结果并附加到自动填充列表
  4. 目前在ajax请求中,我发送的是一组ID,这些ID在客户端缓存中匹配,并使用PHP循环遍历sphinx的结果并从匹配中删除它们。

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

    我希望能够做的是从Sphinx匹配中排除这些特定的ID,以便限制条款实际上是相关的。

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

    我已经通过sphinx文档了解并且已经阅读了相当多的“扩展模式”匹配并使用了各种运算符但是我发现自己变得非常困惑并且不确定如何继续。

    非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

这是用狮身人面像做的好方法:

“目前在ajax请求中,我发送了一个在客户端缓存中匹配的ID数组,并使用PHP循环查看sphinx的结果并将其从匹配项中删除。”

您需要在sphinx中使用setfilter

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

这里$ cl是sphinx类的对象

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

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

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

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

希望这有帮助!!

答案 1 :(得分:2)

$cl->setFilter("id",array(12,45,34,67,34),TRUE);

:)