поиск нескольких полиморфных предметов с помощью мышления сфинкса - PullRequest
2 голосов
/ 11 января 2012

У меня есть таблица вложений, которая имеет несколько значений (через полиморфную ассоциацию).Я хотел бы иметь возможность искать несколько значений (например, AND в SQL) с помощью мышления-сфинкса.

Например:

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 ]

1 голос
/ 29 февраля 2012

Sphinx не имеет представления о парах ключ / значение, поэтому вы не можете попросить его сопоставить значения и field_ids с заданными значениями field_values.

Если вы хотите искать вложения, соответствующие одной паре значение / идентификатор, возможный способ обойти это - вместо этого искать в 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

Группировка гарантирует, что вы получите только один матч за вложение.

Однако, боюсь, это не поможет сопоставить несколько пар значение / идентификатор для вложения. Я не могу придумать, как сделать это со Сфинксом на макушке.

0 голосов
/ 19 мая 2015

Это можно сделать в несколько этапов.

  1. Вам нужно будет ссылаться на идентификаторы FieldValue в индексе вложений:

    has field_values.id, :as => :field_values_ids

  2. Получите идентификаторы для нужных вам пар FieldValue:

    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

Предостережение : вы теряете нумерацию страниц и порядок (см. Пэт ответ на мой вопрос).

...