2015-02-11 88 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] }) 

它返回所有的子组的用户,但没有从用户组ID为

  • 狮身人面像2.1.7运行UNDEX Arch Linux的
  • 思考狮身人面像V3.1.1
+0

是否有原因使用/作为分隔符而不是逗号? – pat 2015-02-11 09:53:01

+0

祖先使用/作为分隔符默认情况下。使用不同的结果没有结果。 – user3332726 2015-02-11 10:13:14

+0

Sphinx预计逗号作为多值属性中的整数分隔符。你可以改变所有/ s,在生成的字符串中?另外,您应该能够通过在'config/development.sphinx.conf'中的user_core_0源文件中运行生成的sql_query来检查生成的值,并为特定用户更改'WHERE'子句。 – pat 2015-02-11 15:52:21

回答

0

终于发现了问题:

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

返航每组只有1个ID或祖先,意义如果用户具有很少的根组,例如3,5 上面的表达式将只返回1个组:

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

和ID为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 | 

而且,它正常工作与 “/” 分隔符。