2

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

Например:

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)

Можно ли сделать запрос, аналогичный этому

ответ

1

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

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

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

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

+0

Раньше я использовал индексы на FieldValue для выполнения поиска, но мне показалось, что у меня получилось немного «взломать», поэтому надеялся, что существует «официальный» способ сделать это. Я в основном пытаюсь повторить что-то вроде: '' ' define_index делать индексов: value_one индексов: value_two индексов: value_three конца ' '' , но так как ассоциация полиморфных value_ [one..three] определяются как ключ/значение (как вы отметили выше). Я могу обойти это, используя стандартный файл Attachment.search, затем индивидуальные запросы FieldValue.search и объединить результаты, но это хак, который я хочу избежать: P –

+0

Извините, попробовал отредактировать кучу раз, но забыл, что вы не можете реально комментарии формата: P –

+0

Можно ли получить результаты отдельно и пересечь их? См. Этот вопрос: http://stackoverflow.com/questions/30305981/intersect-thinking-sphinx-results – Jonathan

0

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

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

    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. Intersect результаты:

    r1.to_a & r2.to_a

РИСКОВАННАЯ: Вы лос e pagination and ordering (см. Pat's answer на мой вопрос).

 Смежные вопросы

  • Нет связанных вопросов^_^