在Solr中查询用户输入日期是否落在索引的日期范围列表内
方案1(推荐:调整索引结构,查询性能最优)
你当前将日期范围存储为拼接字符串的格式查询效率较低,推荐将字段调整为Solr原生DateRangeField多值类型:
- 修改managed-schema字段配置:
<field name="from_datetimeList" type="daterange" multiValued="true" indexed="true" stored="true"/>
- 原有索引写入逻辑无需调整,你示例的
2021-08-27T00:00:00Z-2021-08-31T00:00:00Z格式完全符合DateRangeField的写入规范 - 最终查询语句如下,只需替换
${userInputDate}为用户实际输入的UTC格式日期即可:q=from_datetimeList:"[${userInputDate} TO ${userInputDate}]"
该查询会自动匹配多值字段中任意一个范围包含输入日期的文档,你可以通过返回结果是否为空判断是否命中,也可搭配
fl参数自定义返回命中标记字段。
方案2(兼容现有索引结构,无需修改Schema)
如果当前无法调整索引结构,可通过Solr函数查询实现匹配,查询语句如下:
q={!func}or( for-each( from_datetimeList, 'range', and( gte(date(${userInputDate}), date(strsplit($range, '-', 1, 1))), lte(date(${userInputDate}), date(strsplit($range, '-', 2, 1))) ) ) ):1
- 逻辑说明:
- 通过
strsplit函数按-拆分每个范围字符串,分别得到区间的开始日期和结束日期 - 将拆分后的字符串转换为日期类型,和用户输入的日期做大小比较
- 遍历所有多值范围,只要有一个区间满足输入日期在范围内就返回1,匹配值为1的即为命中结果
- 通过
注意事项
- 所有日期必须使用Solr标准UTC格式,即
yyyy-MM-ddTHH:mm:ssZ格式,否则会出现日期解析错误 - 方案2的查询性能低于方案1,数据量大的场景优先选择调整索引结构为
DateRangeField
内容的提问来源于stack exchange,提问作者Anshul Verma
相关产品推荐
相关产品推荐

