solrj日期范围内查询详解

Hello!欢迎各位新老朋友来看小弟博客,祝大家事业顺利,财源广进!!

开发环境

  • solrj 7.7.3

solr官方日期表达

在solr官方文档上,对日期格式的要求和表达如下:

Solr 日期格式

Solr 的日期字段(DatePointFieldDateRangeField 和已过时的
TrieDateField)代表“datas”,如时间精确到毫秒的点。使用的格式是XML Schema规范中 dateTime
的规范化表示形式的限制形式,这是 ISO-8601 的一个受限子集。对于那些熟悉 Java 8 的人来说,Solr 使用
DateTimeFormatter.ISO_INSTANT 进行格式化,并使用 “leniency” 进行解析。如以下示例:

YYYY-MM-DDThh:mm:ssZ

其中:

  • YYYY 是表示年份。
  • MM 是表示月份。
  • DD 是表示月份的某一天。
  • hh 是表示一天24小时的时间。
  • mm 是表示分钟。
  • ss 是表示秒。
  • Z 是一个字面的“Z”字符,表示该日期的字符串表示形式是 UTC。

请注意,不能指定时区。日期的字符串表示形式始终以协调世界时 (UTC) 表示。这是一个示例值:

1972-05-20T17:33:18Z

Solr 日期范围格式

Solr 的 DateRangeField
支持上面描述的时间段语法中的相同点(具有下面描述的日期数学)以及更多的表达日期范围。一类示例是截断的日期,它表示整个日期跨度到所指示的精度。另一个类使用范围语法(TO)。下面是一些示例:

  • 2000-11:2000年11月的整个月
  • 2000-11T13:同样,但在一天中的一个小时(1300至1400前,即下午1点至2点)。
  • -0009:公元前10年,年份中的 0 是公元 0,也被认为是公元前1年。
  • [2000-11-01 TO 2014-12-01]:指定的日期范围在一天的分辨率。
  • [2014 TO 2014-12-01]:从 2014 年开始到 12 月的第一天结束。
  • [* TO 2014-12-01]:从最早的可代表时间到2014年12月12日的一天结束。

限制范围语法不支持嵌入日期数学。如果您指定了 DatePointField 支持的日期实例,并将日期数学截断,比如 NOW/DAY,那么您仍然可以得到当天的第一个毫秒,而不是整天的范围。独占范围(使用{&})在查询中工作,但不适用于索引范围。

了解了上面的信息知识,那就好办啦!以此类推,想要时间范围就是["+dateString1+" TO "+dateString2+"];那么查询条件就是 查询字段:["+sdf.format(new Date())+" TO "+sdf.format(new Date())+"]
在这里插入图片描述

Solr 实际应用

我这里是archiveTime你们根据自己实际情况调整

核心代码:

SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
StringBuffer fqBuffer = new StringBuffer();
String archiveTime = "archiveTime:[" + sdf.format(inputFormat.parse(params.getArchiveStartTime())) + " TO " + sdf.format(inputFormat.parse(params.getArchiveEndTime())) + "]";
fqBuffer.append("(").append(archiveTime).append(")");//归档时间

实际代码如下

/**
     * 处理查询filterQuery
     * @return
     */
    private StringBuffer dealFilterQuery(ArchiveInfoParam params) {
        SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
        StringBuffer fqBuffer = new StringBuffer();
        boolean isFirstCondition = true;

        if (ObjectUtils.isNotEmpty(params.getName())) {
            if (!isFirstCondition) {
                fqBuffer.append(" AND ");
            }
            fqBuffer.append("name:").append(params.getName()); // 题名
            isFirstCondition = false;
        }
        
        if (ObjectUtils.isNotEmpty(params.getArchiveStartTime()) && ObjectUtils.isNotEmpty(params.getArchiveEndTime())) {
            if (!isFirstCondition) {
                fqBuffer.append(" AND ");
            }
            try {
                String archiveTime = "archiveTime:[" + sdf.format(inputFormat.parse(params.getArchiveStartTime())) + " TO " + sdf.format(inputFormat.parse(params.getArchiveEndTime())) + "]";
                fqBuffer.append("(").append(archiveTime).append(")");//归档时间
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
            isFirstCondition = false;
        }

        return fqBuffer;
    }

好了,朋友们,今天就到这里了,喜欢的朋友们还请留下您的小赞赞,小弟会更加努力更新!!如果感兴趣的话,欢迎关注小弟公众号!!!🥳🥳🥳

欢迎加入"科技脉搏"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值