2014-01-29 206 views
2

日期使用solr可以针对单个日期字段进行查询。但我的数据中有合格的开始日期(比如说2001/01/01)和结束日期(比如2012/01/01)。现在我必须查询2006/01/01至2013/01/01的日期范围。这应该给我从2006/01/01(搜索开始日期>资格日期)到2012/01/01(搜索结束日期超出资格结束日期之外)的数据。对于日期范围,solr中的查询日期范围

查询2个不同的字段并不总是给出正确的结果。有什么办法来查询这种日期范围与日期范围查询?

回答

1

您可以轻松地查询的Solr来获得相关的文档返回,但是,是什么我认为你不能轻易得到那样的结果。

你可以尝试使用FunctionQueries建立这个作为一个返回现场,看看毫秒部分,但我不知道你能实现它,如果你这样做,这将是一个非常令人费解的功能..

当然,你总是可以在客户端自己计算重叠范围。

1

我不知道Solr的具体,但在大多数的查询语言,我用你会使用类似以下内容:

SELECT * 
FROM table 
WHERE @EligStartDate <= [EligEndDate] 
    AND @EligEndDate >= [EligStartDate] 

@EligStartDate是你的输入开始日期和@EligEndDate是你的输入端日期)

这将查找两个合格日期范围之间存在重叠的所有记录。现在,如果你要修剪的结果,你必须在数据库中的东西,你可以使用像一个最小值/最大值功能:

/* Use the latest start date and the earliest end date */ 
SELECT MAX(@EligStartDate, [EligStartDate]) 
    , MIN(@EligEndDate, [EligEndDate]) 
... 
1

退房克里斯·斯泰德的幻灯片显示,Spatial Search Tricks for People Who Don't Have Spatial Data

还有DOC在Solr的维基:SpatialForTimeDurations

外卖的是,你可以代表在X的时间,Y坐标系统和Solr会告诉你“箱子”是否重叠。这不是非常直观,但它是一个很酷的伎俩。

+0

补充了解,他想要的是在结果中获取:field1,field2,2006/01/01-2012/01/01与这些具体的日期值。你能解释空间技巧如何做到这一点吗? – Persimmonium

0

这就是Solr DateRangeField设计用于支持的具体内容,但您可能必须升级至少Solr 1.5以获取它。范围的两端都被索引为字段中的单个值。支持多个范围(值)。

Solr的DateRangeField支持在上述(与下述日期数学),更表达 日期范围时间日期语法 的相同点。一类示例是截断日期,其中 表示整个日期跨度到所指示的精度。另一个 类使用范围语法([TO])。下面是一些例子:

2000-11 – The entire month of November, 2000. 
2000-11T13 – Likewise but for an hour of the day (1300 to before 1400, i.e. 1pm to 2pm). 
-0009  – The year 10 BC. A 0 in the year position is 0 AD, and is also considered 1 BC. 
[2000-11-01 TO 2014-12-01] – The specified date range at a day resolution. 
[2014 TO 2014-12-01]  – From the start of 2014 till the end of the first day of December. 
[* TO 2014-12-01]   – From the earliest representable time thru till the end of the day on 2014-12-01. 

作为一个额外的奖金,新的字段类型似乎是faster for common date queries比它的前辈了。