Solr - 计算两个日期字段范围内的文档

时间:2017-12-11 21:15:48

标签: date solr facet

以下是我获得的一些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中有更好的方法可以解决这个问题吗?

理想情况下,替代方法可以按小时或分钟提供帮助,而不仅仅是几天。如果我们更细化,上述方法将具有非常大的多值字段。另外,有没有一个很好的方法来填补漏洞(即缺少日期),计数为零?

1 个答案:

答案 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