在solrj中按日期字段分组

时间:2013-03-05 05:37:23

标签: solrj

我想对我通过日期类型获得的输出进行分组。但我使用datetime类型将数据存储在solr中。我正在使用的日期格式是

          Date format :: "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

 For e.g. Date is stored in solr as "2013-03-01T20:56:45.000+00:00"

我想要的输出是日期的数量:: .e.g。

   Date1:: "2013-03-01T20:56:45.000+00:00"
   Date2:: "2013-03-01T21:56:45.000+00:00"
   Date3:: "2013-03-01T22:56:45.000+00:00"
   Date3:: "2013-03-02T22:56:45.000+00:00"
   Date4:: "2013-03-02T23:56:45.000+00:00"

所以我希望输出为两列::

     Date           Count
     2013-03-01       3  
     2013-03-02       2  

这是我正在使用的代码

    String url = "http://192.168.0.4:8983/solr";
SolrServer server = new HttpSolrServer(url);
SolrQuery query = new SolrQuery();


query.setQuery("*:*");
query.addFilterQuery("sessionStartTime:[2013-03-01T00:00:00Z TO 2013-03-04T24:00:00Z]");

query.add("group", "true");
query.add("group.field","uniqueId"); // uniqueId is grouping the data 
query.add("group.main","true");
query.setRows(9999);

QueryResponse rs=server.query(query);

Iterator<SolrDocument> iter = rs.getResults().iterator();

非常感谢帮助。

2 个答案:

答案 0 :(得分:1)

我知道这是一个较老的问题,但我正在研究与此相关的事情,所以我想我会分享我的解决方案。由于您使用的是分组,rs.getResults()可能会为空。通过阅读SolrJ API并在我的结尾进行一些测试后,您会发现结果确实按照您希望的那样进行分组。要访问它们,请创建一个如下变量:

List<Group> groupedData = rs.getGroupResponse().getValues().get(0).getValues()

请注意,Group是班级org.apache.solr.client.solrj.response.Group

然后,遍历groupedData,使用groupedData.get(i).getResult()来获取每个分组值的SolrDocumentList个结果。在您的示例中,(假设数据按照您的说法进行排序),groupedData.get(0)将为您提供日期为2013-03-01的三场比赛中的SolrDocumentList

我知道这是方法调用的链条,但最终会得到结果。如果有人知道更快的方式来获取数据,请随时告诉我,我也想知道。

有关详细信息,请参阅GroupResponse的API

请注意,这个答案适用于Solr 5.4.0

答案 1 :(得分:0)

您尝试实现的输出,我相信更适合Faceting分组。更具体地查看Date Faceting上的文档,SolrJ完全支持分面,请参阅SolrJ - Advanced Usage。有关Faceting的介绍,我建议您阅读Faceted Search with Solr