思考Sphinx应用程序范围的搜索:通过仅存在于某些模型中的属性进行过滤

时间:2010-11-05 22:45:39

标签: search thinking-sphinx

我想搜索多个模型,并根据某些模型具有的某些属性进行过滤,有些则不需要。我希望带有属性的模型被过滤,但没有它的模型只是忽略它。

目前只有具有该属性的模型才会返回结果。有没有办法让其他模型以某种方式忽略属性过滤器返回结果?

2 个答案:

答案 0 :(得分:5)

找到了一种方法。在没有这种属性的模型的索引上,可以像这样创建一个虚拟的:

has "0", :type => :integer, :as => :the_attribute_name

然后在执行应用程序范围的搜索时:

@results = ThinkingSphinx.search(@search_term, 
  :with => {:the_attribute_name => [@the_attribute_value, 0]}
)

顺便说一下,这假设在具有此属性的模型上不允许零值。 如果零是那些模型中的有效属性,则可以使用另一个值(例如9999999)。 请注意,属性不能接受负整数。

答案 1 :(得分:0)

我必须在default_sphinx_scope中执行此操作并且应用程序太大我无法检查每个模型并为那些没有该属性的人执行此操作。所以我用以下方法做到了:

class User

  ...

  sphinx_scope(:active_only) do
    if self.respond_to?(:status)
      {:with => {:status => true}}
    else
      {}
    end
  end
  default_sphinx_scope(:active_only)

  ...
end

仅在scope列出现时才应用status。干杯。