如何让Solr仅针对查询结果集生成Facet计数?
针对你遇到的问题——主查询仅匹配1条文档,但Solr计算externalid的facet时却遍历整个20亿+文档的索引,导致耗时长达2分钟——我给你几个针对性的解决方案,都是基于DSE 6.0(对应Solr 6.x)的特性优化的:
核心原因分析
你当前的查询使用了默认的facet.method=dv(DocValues 模式),这种模式会先遍历externalid字段的所有唯一值,再逐个统计每个值在主查询结果集中的匹配数。如果externalid有大量唯一值(接近20亿),这个遍历过程会极慢,哪怕主查询只返回1条文档。我们需要让Solr反过来:先获取主查询的文档集合,再仅统计这些文档中的externalid值。
解决方案1:强制使用Field Cache模式计算Facet
在查询中添加facet.method=fc参数,强制Solr采用Field Cache方式计算facet。这种模式会先拿到主查询匹配的所有文档ID,再从字段缓存中提取这些ID对应的externalid值,最后统计计数——因为主查询只返回1条文档,这个过程会瞬间完成。
修改后的完整查询:
http://localhost:8983/solr/gencat.imagemetadata/select?q=id:"TH-1961-46483-10968-9"&wt=json&indent=true&facet=true&facet.field=externalid&facet.mincount=1&facet.method=fc
解决方案2:优化字段类型定义
你当前使用的StrField是Solr的旧版字符串类型,推荐换成更适合facet/排序的string类型(两者都是不分词的字符串,但string类型的底层实现更高效)。修改字段定义后需要重新索引数据:
<field docValues="true" indexed="true" multiValued="false" name="externalid" stored="true" type="string"/>
可选优化:并行计算Facet(针对多结果场景)
如果后续你的主查询可能返回多条文档,可以添加facet.threads=N参数(比如facet.threads=4),让Solr并行处理facet计算,进一步提升速度。不过对于当前仅1条结果的场景,这个优化的作用不大。
内容的提问来源于stack exchange,提问作者bjhale
相关产品推荐
相关产品推荐

