思考狮身人面像祖先搜索
Thinking sphinx ancestry searching
我需要从包括子组在内的组中获取所有用户:
app/indices/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] })
它 returns 来自子组的所有用户,但没有来自 ID 为 3
的组的用户
- Sphinx 2.1.7 运行 undex arch linux
- 思维狮身人面像 v3.1.1
终于找到问题所在:
has "CONCAT_WS('/',groups.id,groups.ancestry)", as: :group_ids, type: :integer, multi: true
是 return 每个组只有 1 个 ID 或祖先,这意味着如果用户的根组很少,例如 3,5
上面的表达式将 return 只有 1 组:
+----+--------+-----------+
| id | groups | group_ids |
+----+--------+-----------+
| 39 | 5 | 5/3 |
| 40 | 245,3 | 245 |
| 42 | 5 | 5/3 |
| 43 | 234 | 234/3/5 |
ID 为 40 的用户未找到。但是,如果您注意到,groups 列的一切正常。解决方案是使用组连接:
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 |
此外,使用“/”分隔符也能正常工作。
我需要从包括子组在内的组中获取所有用户:
app/indices/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] })
它 returns 来自子组的所有用户,但没有来自 ID 为 3
的组的用户- Sphinx 2.1.7 运行 undex arch linux
- 思维狮身人面像 v3.1.1
终于找到问题所在:
has "CONCAT_WS('/',groups.id,groups.ancestry)", as: :group_ids, type: :integer, multi: true
是 return 每个组只有 1 个 ID 或祖先,这意味着如果用户的根组很少,例如 3,5 上面的表达式将 return 只有 1 组:
+----+--------+-----------+
| id | groups | group_ids |
+----+--------+-----------+
| 39 | 5 | 5/3 |
| 40 | 245,3 | 245 |
| 42 | 5 | 5/3 |
| 43 | 234 | 234/3/5 |
ID 为 40 的用户未找到。但是,如果您注意到,groups 列的一切正常。解决方案是使用组连接:
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 |
此外,使用“/”分隔符也能正常工作。