2015-02-11 5 views
0

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

приложение/индексов/user_index.rb

ThinkingSphinx::Index.define :user, with: :active_record, delta: ThinkingSphinx::Deltas::SidekiqDelta do 
    has groups.id 
    has "CONCAT_WS('/',groups.id,groups.ancestry)", as: :group_ids, type: :integer, multi: true 
end 

Но когда я пытаюсь искать:

User.search_for_ids(with_all: { group_ids: [3] }) 

возвращает все пользователи из подгрупп, но без пользователей из группы с идентификатором

  • Sphinx 2.1.7 работает undex Arch Linux
  • Мышление сфинкса v3.1.1
+0

Есть ли причина, по которой вы используете/в качестве разделителя вместо запятой? – pat

+0

По умолчанию по умолчанию используется/как разделитель. Использование другого не дает результата. – user3332726

+0

Sphinx ожидает, что запятые будут целочисленными разделителями в многозначных атрибутах. Можете ли вы изменить все/s на, в пределах этой сгенерированной строки? Кроме того, вы должны иметь возможность проверить сгенерированное значение, запустив сгенерированный sql_query из источника user_core_0 в 'config/development.sphinx.conf' с измененным предложением WHERE для конкретного пользователя. – pat

ответ

0

Наконец обнаружили проблему:

has "CONCAT_WS('/',groups.id,groups.ancestry)", as: :group_ids, type: :integer, multi: true 

возвращавшегося только 1 идентификатор или происхождение каждой группы, имея в виду если у пользователя мало корневых групп, например, 3,5 , приведенное выше выражение вернет только 1 группу:

+----+--------+-----------+ 
| id | groups | group_ids | 
+----+--------+-----------+ 
| 39 | 5  | 5/3  | 
| 40 | 245,3 | 245  | 
| 42 | 5  | 5/3  | 
| 43 | 234 | 234/3/5 | 

и пользователь с идентификатором 40 не находил. Но, если вы заметили, все отлично работает для столбцов групп. Решение состоит в том, чтобы использовать группу CONCAT:

has "CONCAT_WS('/',GROUP_CONCAT(DISTINCT groups.`id` SEPARATOR '/'), GROUP_CONCAT(groups.`ancestry` SEPARATOR '/'))", as: :group_ids, type: :integer, multi: true 

Результат:

+----+--------+-----------+ 
| id | groups | group_ids | 
+----+--------+-----------+ 
| 39 | 5  | 5/3  | 
| 40 | 245,3 | 245/3  | 
| 42 | 5  | 5/3  | 
| 43 | 234 | 234/3/5 | 

Кроме того, он прекрасно работает с "/" разделителем.