Sphinx中MVA字段单独统计各ID数量的实现方法
问题描述
我在Sphinx中执行了以下查询:
select MVA_FIELD from mySphinxIndex facet MVA_FIELD order by count(*) desc;
得到的结果如下:
+----------------------------+----------+ | MVA_FIELD | count(*) | +----------------------------+----------+ | | 664 | | 0 | 536 | | 13 | 439 | | 4,13 | 8 | | 19,13 | 8 | | 18,13,20 | 8 | | 8,17,18 | 8 | | 8,18,13 | 8 | | 8,15,18 | 8 | | 8,13,20 | 7 | | 17,13 | 7 | | 18,19,20 | 7 | | 8,17 | 7 | | 13,17,19 | 7 | | 11,6 | 7 | | 6,11,13 | 7 | | 15,18 | 7 | | 11,13,20 | 7 | | 11,13,17 | 7 | | 6,18,19 | 6 | | 7,20 | 6 | | 8,11,13 | 6 | | 13,17,20 | 6 |
我希望获取MVA_FIELD中每个单独ID(如0、4、13等)的统计数量,请问该如何实现?
解决方案
Sphinx原生facet语法无法直接拆分MVA字段内的单个ID做统计,你可以通过以下两种方式实现需求:
方法1:查询后客户端处理
先通过Sphinx查询获取所有MVA字段的集合,再在客户端拆分统计:
- 执行查询合并所有MVA值:
SELECT GROUP_CONCAT(MVA_FIELD SEPARATOR ',') AS all_ids FROM mySphinxIndex;
- 在客户端(以Python为例)拆分并统计:
from collections import Counter # 替换为实际查询返回的all_ids字符串 all_ids_str = "0,13,4,13,19,13,..." # 拆分并过滤空值 id_list = [id.strip() for id in all_ids_str.split(',') if id.strip()] # 统计每个ID出现次数 id_counts = Counter(id_list) # 按次数降序输出结果 for id, count in id_counts.most_common(): print(f"{id}: {count}")
方法2:索引阶段预处理(推荐)
如果需要频繁做这类统计,建议在构建Sphinx索引时提前拆分MVA字段:
- 在数据源(如MySQL)中创建关联表,将每个MVA单独ID与文档ID一一关联。
- 让Sphinx索引这个关联表,之后直接对单个ID字段做
facet查询:
SELECT id FROM mva_single_ids_index facet id ORDER BY count(*) DESC;
这样就能直接得到每个单独ID的统计结果。
内容的提问来源于stack exchange,提问作者Soorya J
相关产品推荐
相关产品推荐

