Sphinx 3索引关系型数据库:查询指定分类下评论的配置问题排查
解决Sphinx sql_attr_multi关联错误问题
看起来你遇到的是Sphinx多值属性关联时的字段匹配问题——你的sql_attr_multi子查询错误地用评论ID(reviews.id)去关联分类表的restaurant_id,而不是用餐厅ID(restaurants.id)。这是因为Sphinx默认会用主查询的主键(也就是你定义的id字段,对应reviews.id)去匹配子查询的关联字段,而你没有明确指定要关联的是主查询里的restaurant_id。
解决方案:明确指定子查询的关联字段
修改你的sql_attr_multi配置,在子查询中添加过滤条件,用主查询返回的restaurant_id去关联分类表:
sql_attr_multi = uint category_id from query; SELECT c.restaurant_id, c.id as category_id FROM categories c WHERE c.restaurant_id = $restaurant_id
为什么这样有效?
- 主查询中你已经返回了
restaurants.id as restaurant_id,这个字段代表评论所属餐厅的ID。 - 在
sql_attr_multi的子查询里,$restaurant_id会被Sphinx替换成当前主查询行的restaurant_id值,这样就能正确关联到该餐厅对应的所有分类ID。 - 原来的子查询没有过滤条件,Sphinx默认用主查询的主键(
reviews.id)去匹配categories.restaurant_id,这就导致了错误的关联逻辑。
完整配置示例
sql_query = SELECT reviews.id as id, reviews.body as body, restaurants.url as url, restaurants.id as restaurant_id FROM reviews INNER JOIN restaurants ON restaurants.id = reviews.restaurant_id sql_attr_multi = uint category_id from query; SELECT c.restaurant_id, c.id as category_id FROM categories c WHERE c.restaurant_id = $restaurant_id
这样配置后,Sphinx就能正确为每条评论关联其所属餐厅的所有分类ID了,你就可以正常查询指定分类下的评论了。
内容的提问来源于stack exchange,提问作者EBAG
相关产品推荐
相关产品推荐

