什么是使用Thinking Sphinx范围的正确方法

时间:2013-12-23 18:04:01

标签: ruby-on-rails thinking-sphinx

我正在尝试按如下方式创建TS范围:

include ThinkingSphinx::Scopes
sphinx_scope(:status_approved) {
      {:conditions => {:status => "approved"}}
    }
default_sphinx_scope :status_approved 

我的indice文件是:

indexes name, status
has user_id, created_at

两个问题:

  1. 是否需要将字段状态定义为索引才能使条件字符串过滤器生效?如果我不这样做,似乎我在架构查询错误中得到 no字段。
  2. 如果需要定义索引的一部分,那么每当有人更新状态字段时,在下一次重新索引发生之前,它不会显示在结果中。这是使用字符串过滤TS范围的唯一方法吗?或者有更好的方法吗?
  3. 我正在使用Rails 3.2.16和TS 3.0.6

2 个答案:

答案 0 :(得分:3)

  1. Sphinx范围适用于您的Sphinx搜索,所以是的,如果您在Sphinx范围内使用它,则需要将状态作为索引定义中的字段。
  2. 如果您希望尽快更新您的Sphinx索引数据,您可能需要使用delta索引(可能使用Delayed JobSidekiq进行调查,以将其从Web进程中删除)。或者,您可以使用Sphinx的real-time indices代替。

答案 1 :(得分:0)

在进一步研究后回答我自己的问题:

  1. 我搜索了文档,但没有找到任何具体的参考资料。我可能错过了它。但是通过试验和错误,我发现如果我想使用字符串过滤器方法,我必须将字段添加到索引中。如果没有,它会抱怨在架构中找不到该字段。
  2. 有一个新的'引入TS的功能称为实时指数,它显然解决了这个问题。这在作者的博客http://freelancing-gods.com/中提到过,我还没有尝试过。在任何情况下,我采用了一种不同的路线,它使用默认范围,并在索引中使用过滤。在我的索引文件中,我现在有:

    indexes name, status
    has user_id, created_at
    where "status = 'approved'"
    
  3. 我不再需要在我的模型中定义默认范围。在任何情况下,这仍然需要定期重建索引。