以下是我获得的一些Solr文档示例:
{
"id": "1",
"openDate": "2017-12-01T00:00:00.000Z",
"closeDate": "2017-12-04T00:00:00.000Z"
},
{
"id": "2",
"openDate": "2017-12-02T00:00:00.000Z",
"closeDate": "2017-12-04T00:00:00.000Z"
},
{
"id": "3",
"openDate": "2017-12-02T00:00:00.000Z",
"closeDate": "2017-12-06T00:00:00.000Z"
}
文档的日期"活跃"是openDate(包含)和closeDate(不包括)之间的日期。我想计算一些活跃的文件数量#34;在每一天,所以输出应该是:
[
{
Date: 2017-12-01,
count: 1
},
{
Date: 2017-12-02,
count: 3
},
{
Date: 2017-12-03,
count: 3
},
{
Date: 2017-12-04,
count: 1
},
{
Date: 2017-12-05,
count: 1
}
]
解决这个问题的一个简单方法是保留一个多值日期字段(比如名为openDates
),其中包含感兴趣范围内的所有日期,因此我们扩展文档如下:
{
"id": "1",
"openDate": "2017-12-01T00:00:00.000Z",
"closeDate": "2017-12-04T00:00:00.000Z",
"openDates": ["2017-12-01T00:00:00.000Z",
"2017-12-02T00:00:00.000Z",
"2017-12-03T00:00:00.000Z"]
},
{
"id": "2",
"openDate": "2017-12-02T00:00:00.000Z",
"closeDate": "2017-12-04T00:00:00.000Z",
"openDates": ["2017-12-02T00:00:00.000Z",
"2017-12-03T00:00:00.000Z"]
},
{
"id": "3",
"openDate": "2017-12-02T00:00:00.000Z",
"closeDate": "2017-12-06T00:00:00.000Z",
"openDates": ["2017-12-02T00:00:00.000Z",
"2017-12-03T00:00:00.000Z",
"2017-12-04T00:00:00.000Z",
"2017-12-05T00:00:00.000Z"]
}
然后我可以像这样运行一个方面查询:
/select?q=*:*&facet=true&facet.field=openDates&rows=0
获得我需要的计数。
在Solr中有更好的方法可以解决这个问题吗?
理想情况下,替代方法可以按小时或分钟提供帮助,而不仅仅是几天。如果我们更细化,上述方法将具有非常大的多值字段。另外,有没有一个很好的方法来填补漏洞(即缺少日期),计数为零?
答案 0 :(得分:2)
DateRangeField将来救援。在架构中,您将添加如下内容:
<fieldType name="range_date" class="solr.DateRangeField" />
<field name="active" type="range_date" indexed="true" stored="false"/>
您可以像这样指定有效range:
doc1.addField("active", "[2017-12-01T00:00:00.000Z TO 2017-12-04T00:00:00.000Z]")
以后通过此字段请求range facets。
具有1天粒度的参数示例(您可以为不同的值更改gap
参数):
q.add("facet", "true")
q.add("facet.range", "active")
q.add("facet.range.start", "NOW/MONTH")
q.add("facet.range.end", "NOW/MONTH+1MONTH")
q.add("facet.range.include", "outer")
q.add("facet.range.gap", "+1DAY")
我添加了facet.range.include=outer
以保持确切的格式响应(不包括上限和下限)。您可以通过choosing更改此参数。
您将得到您所需要的:
2017-12-01T00:00:00Z
1
2017-12-02T00:00:00Z
3
2017-12-03T00:00:00Z
3
2017-12-04T00:00:00Z
1
2017-12-05T00:00:00Z
1
代码的完整示例是here。