【问题标题】:How can I make sphinx ignore certain ID's when matching?如何让 sphinx 在匹配时忽略某些 ID?
【发布时间】:2012-10-15 09:43:07
【问题描述】:

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

逻辑如下:

  1. 对缓存的结果执行客户端模糊匹配算法并在自动完成中显示
  2. 如果matches.length
  3. 返回结果并附加到自动完成列表

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

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

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

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: php sphinx


    【解决方案1】:

    这是使用 sphinx 的好方法:

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

    你需要在 sphinx 中使用setfilter

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

    这里的$cl是sphinx类的对象

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

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

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

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

    希望对您有所帮助!

    【讨论】:

      【解决方案2】:
      $cl->setFilter("id",array(12,45,34,67,34),TRUE);
      

      :)

      【讨论】:

      • sigh Sphinx 真的很简单,我不知道为什么我很难理解某些方面。我认为这只是文档中缺少实际的代码示例。除了文档之外,它实际上非常好。无论如何...谢谢barryhuner,非常感谢。但是,我将把答案授予 user868766,因为他/她的答案是最完整的。再次感谢!
      猜你喜欢
      • 2018-03-10
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多