使用思维狮身人面像搜索多个多态项目

时间:2012-01-11 18:38:08

标签: ruby-on-rails-3 thinking-sphinx polymorphic-associations

我有一个附件表,它有多个值(通过多态关联)。我希望能够通过思考-sphinx搜索多个值(比如SQL中的AND)。

例如:

class FieldValue < ActiveRecord::Base
  belongs_to :customized, :polymorphic => true
end

class Attachment < ActiveRecord::Base
  has_many  :field_values, :as => :customized, :dependent => :destroy

  define_index do
    has field_values.field_id, :as => :field_ids, :type => :multi

    indexes field_values.value, :as => :field_values, :type => :multi

    set_property :enable_star   => 1
    set_property :min_infix_len => 3
  end
end

我的FieldValue模型有一个字段(值),所以使用上面的索引定义,我可以做类似的事情:

Attachment.search :conditions => { :field_values => ["*5100*", "1"] }, :with => { :field_ids => [23, 24] }

但从技术上讲,这并不是我所希望的。 field_values应与field_ids匹配(类似于select * from attachments where (field_value.id = 23 and field_value.value like '*5100*) and (field_value.id = 23 and field_value.value = '1')

(我知道上面没有联接:P)

是否可以进行类似的搜索?

2 个答案:

答案 0 :(得分:1)

Sphinx没有键/值对的概念,所以你不能要求它匹配给定field_values上的值和field_ids。

如果您要搜索与单个值/ ID对匹配的附件,可能的方法是搜索FieldValue,然后按customized_id进行分组:

class FieldValue < ActiveRecord::Base
  define_index do
    indexes value
    has field_id, customized_id
  end
end

FieldValue.search :conditions => {:value => '1'}, :with => {:field_id => 23},
  :group_by => 'customized_id', :group_function => :attr

分组将确保每个附件只能获得一个匹配。

但是,我担心这对于附件的多个值/ id对没有帮助。我想不出用Sphinx做到这一点的方法。

答案 1 :(得分:0)

这可以分几个步骤完成。

  1. 您需要在附件索引中引用FieldValue&#id;

    has field_values.id, :as => :field_values_ids

  2. 获取所需FieldValue对的ID:

    v1 = FieldValue.search_for_ids(conditions: { value: "*5100*" }, with: { field_id: 23 })

    v2 = FieldValue.search_for_ids(conditions: { value: "1" }, with: { field_id: 24 })

  3. 搜索包含这些对的附件:

    r1 = Attachment.search(with: { field_values_ids: v1 })

    r2 = Attachment.search(with: { field_values_ids: v2 })

  4. 将结果相交:

    r1.to_a & r2.to_a

  5. 警告:您失去了分页和排序(请参阅我的问题的Pat's answer)。

相关问题