如何对Solr DateRangeField执行'terms'类型JSON分面查询?
问题分析与解决方案
问题原因
Solr的DateRangeField在索引时,会将日期范围转换为内部的区间编码结构(基于前缀树实现高效范围查询),并不会把[2017-01-01 TO *]这类原始字符串作为索引词项存储。而terms分面是基于索引中的词项进行统计,因此直接对DateRangeField字段执行terms分面会返回空桶。
可行解决方案
方案一:新增字符串字段存储原始范围值
这是最通用且可扩展的方案,通过额外字段保留原始日期范围字符串,专门用于terms分面统计:
- 修改Schema,添加字符串类型的动态字段:
<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> <dynamicField indexed="true" multiValued="false" name="*_range_str" stored="true" type="string"/>
索引文档时,将
object_production_year_range_dt的原始范围值同步存入object_production_year_range_str字段。执行Terms分面查询,使用新增的字符串字段:
"production_year": { "type": "terms", "field": "object_production_year_range_str", "mincount": 1 }
方案二:使用Facet Query手动指定范围(适合范围数量少的场景)
如果预先知道所有可能的日期范围值,可以通过facet.query逐个查询每个范围的文档计数:
"facet": { "production_year": { "type": "query", "queries": [ "object_production_year_range_dt:[2017-01-01 TO *]", "object_production_year_range_dt:[1997-01-01 TO 2003-01-01]" ] } }
补充说明
DateRangeField的核心设计目标是支持范围匹配查询和连续区间的分面统计(即你之前成功使用的range类型分面),而非统计原始范围值的出现频次。因此原生不支持直接通过terms分面获取原始范围,必须借助额外字段或手动查询的方式实现需求。
内容的提问来源于stack exchange,提问作者Costyn Van Dongen
相关产品推荐
相关产品推荐

