Solr查询如何判断用户输入时间戳是否落在已索引的时间范围内
Solr时间戳范围匹配查询实现方案
前提说明
假设你Solr集合中存储时间范围的字段为datetime_range,已配置为Solr官方提供的DateRangeField类型(专门用于时间区间查询的字段类型,未配置可先在schema中定义)。如果你的时间范围是拆分为开始、结束两个独立字段存储,可直接跳转至文末的兼容方案。
核心实现逻辑
需求是只要有任意用户输入时间戳落在任意已索引时间范围内就返回true,我们可以利用Solr查询的numFound字段判断:只要查询命中数>0就返回true,等于0返回false。为了提升查询性能,我们直接设置rows=0,不需要返回具体文档内容,只获取命中数即可。
具体查询语句
你给出的示例用户时间戳列表(已修正笔误2021-010为2021-10):
user_input_datetimeList: ["2021-08-28T00:00:00Z", "2021-08-24T00:00:00Z", "2021-10-27T00:00:00Z"]
对应的查询参数如下:
q=datetime_range:(2021-08-28T00\:00\:00Z OR 2021-08-24T00\:00\:00Z OR 2021-10-27T00\:00\:00Z)&rows=0
结果匹配验证
- 当索引的时间范围为
indexed_datetime_range_List时,2021-08-28T00:00:00Z落在区间2021-08-27T00:00:00Z TO 2021-08-31T00:00:00Z内,查询返回numFound>0,结果为true。 - 当索引的时间范围为
indexed_datetime_range_List2时,三个时间戳均不在已索引区间内,查询返回numFound=0,结果为false。
兼容方案:时间范围拆分为开始/结束两个字段存储
如果你的时间范围是用start_time(开始时间)和end_time(结束时间)两个独立字段存储,可使用如下查询语句,逻辑完全一致:
q=( (start_time:[* TO 2021-08-28T00\:00\:00Z] AND end_time:[2021-08-28T00\:00\:00Z TO *]) OR (start_time:[* TO 2021-08-24T00\:00\:00Z] AND end_time:[2021-08-24T00\:00\:00Z TO *]) OR (start_time:[* TO 2021-10-27T00\:00\:00Z] AND end_time:[2021-10-27T00\:00\:00Z TO *]) )&rows=0
注意事项
- 所有时间格式统一使用Solr支持的UTC标准格式
yyyy-MM-dd'T'HH:mm:ss'Z',避免时区偏移导致匹配错误。 - 查询语句中的冒号需要转义,若使用JSON请求体传参可不用手动转义,Solr会自动处理特殊字符。
内容的提问来源于stack exchange,提问作者Anshul Verma
相关产品推荐
相关产品推荐

