Как использовать многозначные атрибуты (MVA) и фасеты вместе в Thinking Sphinx? - PullRequest
7 голосов
/ 22 марта 2012

У меня есть приложение rails 3 с моделями:

class Event < ActiveRecord::Base
  has_many :event_categories
  has_many :categories, through: :event_categories
end

class EventCategory < ActiveRecord::Base
  belongs_to :category
  belongs_to :event
end

class Category < ActiveRecord::Base
  belongs_to :parent, class_name: 'Category'
  has_many :subcategories, class_name: 'Category', foreign_key: :parent_id
end

Мне нужно отфильтровать события по категориям и отобразить дерево категорий с количеством:

Music Festivals (10) # id: 1
-- Classic (2)       # id: 3
-- Pop (8)           # id: 8
IT Conferences (2)   # id: 10
-- Ruby (1)          # id: 11
-- PHP (1)           # id: 12
...

Я пытался сделать какthis:

define_index do
  has category_values, type: :multi, facet: true
end

before_save :collect_category_values

def collect_category_values
  # traversing events categories
  # putting string like '10/1/3' to self.category_values 
  # which contains all event's categories and subcategories
end

Этот код генерирует классные результаты поиска, но число аспектов печально:

{ :category_values => { '1/3' => 2, '10/11' => 1 } }

Вместо:

{ :category_values => { 1 => 10, 3 => 2, 10 => 2, 11 => 1 }

И самая смешная часть началась, когдаЯ решил изменить индекс, но забыл перестроить его:

# old attribute --> has category_values, type: :multi, facet: true
has categories(:id), as: :category_id, type: :multi facet: true

Это грязный хак: sphinx начинает использовать старый запрос индекса с новой логикой модели.Подсчет и результаты поиска отличные.Но, конечно, если мы попытаемся перестроить индексы, развернуть или что-то еще, то счетчики снова будут нарушены.

Вопрос в том, как использовать MVA вместе с фасетами?

Найдены вопросы от '09, с той же проблемой: http://www.mailinglistarchive.com/thinking-sphinx@googlegroups.com/msg00473.html http://groups.google.com/group/thinking-sphinx/browse_thread/thread/e06cfab6aad327d2

Спасибо.

1 Ответ

2 голосов
/ 14 марта 2014

Добавить : all_ints => true к определению этого атрибута.

У меня была та же проблема, и я ее исправил. Пожалуйста, проверьте это здесь:

https://github.com/pat/thinking-sphinx/issues/357

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

...