Datastax DSE 5.1中Solr facet.pivot本地参数为何无法生效?
首先得说,你遇到的问题大概率是两个点:参数配置的小疏漏,加上DSE 5.1对Solr功能的定制限制,咱们一步步来捋:
1. 先修正你的参数逻辑
你的需求是按name分组,统计各Year对应的money总和,但你当前的facet.pivot只指定了name,缺少了year这个层级!要实现嵌套的分组统计,pivot的字段应该是name,year,这样Solr才会先按name拆分,再在每个name下按year拆分,然后结合stats计算每个子节点的money总和。
调整后的参数应该是这样:
stats=true&stats.field={!tag=piv1}money&facet=true&facet.pivot={!stats=piv1}name,year
2. 检查DSE 5.1 Solr的兼容性限制
虽然Solr 6.0官方文档说stats本地参数可以配合facet.pivot,但DSE对Solr做了定制化集成,在5.1这个版本里,stats和facet.pivot的组合支持确实有局限。如果修正参数后还是没效果,你可以试试这两个替代方案:
方案A:用CQL聚合查询(更适合DSE场景)
因为DSE是Cassandra+Solr的融合,你的数据本身就存在Cassandra表中,直接用CQL的聚合查询可能更可靠,而且性能也不错:
SELECT name, year, sum(money) FROM your_keyspace.your_table GROUP BY name, year;
只要你的表结构是按name作为分区键,year作为聚类列(或者合适的分区/聚类组合),这个查询就能直接得到你要的结果。
方案B:用facet.query配合stats组件
如果一定要用Solr查询,可以拆分统计逻辑:先按name分面,再针对每个name的结果,单独查询对应year的money总和。不过这种方式需要多次查询,适合数据量不大的场景。
3. 最后检查你的Schema配置
确保这几个字段的配置符合要求:
money字段必须是数值类型(比如double/float/int),且indexed="true",这样stats组件才能计算总和:<field name="money" type="double" indexed="true" stored="true"/>name和year字段必须indexed="true",保证分面功能正常:<field name="name" type="string" indexed="true" stored="true"/> <field name="year" type="int" indexed="true" stored="true"/>
先按上面的步骤调整测试,如果还是有问题,大概率就是DSE 5.1的Solr版本确实不支持stats+pivot的组合,这时候用CQL聚合会是更稳妥的选择。
内容的提问来源于stack exchange,提问作者Manish Agrawal

