Solrj日期请求

时间:2014-09-25 11:20:48

标签: java date solr solrj

如何使用SolrJ按日期请求?

我以此格式'01/10/2014'作为参数获取日期。然后我将此格式转换为Date对象并将对象转换为UTC格式。以下是我正在做的代码示例:

public class DateHelper {
    public static final String DD_MM_YYYY_FORMAT = "dd/MM/yyyy";
    public static final String SOLR_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";

    public static Date getDateFromString(String date, String format) {
        if (StringUtils.isNotEmpty(date)) {
            try {
                return FastDateFormat.getInstance(format).parse(date);
            } catch (ParseException e) {
                LOGGER.error(e.getMessage());
            }
        }
        return null;
    }

    public static String getStringFromDate(Date date, String format) {
        if (date != null) {
            try {
                return FastDateFormat.getInstance(format).format(date);
            } catch (Exception e) {
                LOGGER.error(e.getMessage());
            }
        }
        return "";
    }        

    public static void main(String...args){
        Date dateFromString = DateHelper.getDateFromString('01/10/2014', DateHelper.DD_MM_YYYY_FORMAT);
        String date = DateHelper.getStringFromDate(dateFromString, DateHelper.SOLR_DATE_FORMAT);
        System.out.println(date);
    }
}

这个小程序会显示“2014-10-01T00:00:00Z”。当我尝试使用过滤器查询在Solr中提交此日期时,我从Sorl收到此错误:

org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: Invalid Date String:'2014-10-01T00'

这是我的Solr查询:

SolrQuery solrQuery = new SolrQuery("*:*");
String date = String.format( "date:%s",dateInput);
query.addFilterQuery(date);

getSolrServer().query(solrQuery, METHOD.POST);

我该如何解决这个问题? THx为您提供帮助。

P.S:班级FastDateFormat来自Apache Commons Lang 3.我使用的是solr版本4.8.1。

2 个答案:

答案 0 :(得分:2)

这是因为filterQuery的创建方式:

String date = String.format( "date:%s",dateInput);
query.addFilterQuery(date);

这样solr得到:

date:2014-10-01T00:00:00Z

由于Query Parser无法正确解析多个:符号而引发异常。


为了解决这个问题,应该转义属于Query Syntax的特殊字符。

从java方面来说,它可以通过这种方式完成(使用SolrJ中的ClientUtils.escapeQueryChars):

String date = String.format( "date:%s", ClientUtils.escapeQueryChars(dateInput));
query.addFilterQuery(date);

答案 1 :(得分:0)

查询solr日期字段的语法 - Date:[YYYY-MM-DDTHH:mm:ssZ]