思考狮身人面像血统搜索

时间:2015-02-11 08:04:27

标签: ruby-on-rails sphinx thinking-sphinx

我需要从包括子组的组中获取所有用户:

应用程序/索引/ 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为 3

的组的用户
  • Sphinx 2.1.7运行undex arch linux
  • 思考sphinx v3.1.1

1 个答案:

答案 0 :(得分: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的用户未找到。但是,如果你注意到,一切都适用于组列。解决方案是使用group 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   |

此外,它适用于" /"分离器。