使用solr可以对单个日期字段进行日期查询。但我的数据中有一个符合条件的开始日期(比如2001/01/01)和结束日期(比如2012/01/01)。现在我要查询2006/01/01至2013/01/01的日期范围。这应该给我从2006/01/01(搜索开始日期>资格日期)到2012/01/01(搜索结束日期超出资格结束日期)的数据。
查询2个不同的字段并不总能给出正确的结果。有没有办法查询这种日期范围与日期范围查询?
答案 0 :(得分:1)
我不是专门知道solr,但在大多数查询语言中,我使用过你会使用如下内容:
SELECT *
FROM table
WHERE @EligStartDate <= [EligEndDate]
AND @EligEndDate >= [EligStartDate]
(@EligStartDate
是您的输入开始日期,@EligEndDate
是您的输入结束日期)
这将找到两个资格日期范围之间存在重叠的所有记录。现在,如果要将结果修剪为数据库中的结果,可以使用MIN / MAX函数:
/* Use the latest start date and the earliest end date */
SELECT MAX( @EligStartDate, [EligStartDate] )
, MIN( @EligEndDate, [EligEndDate] )
...
答案 1 :(得分:1)
您可以轻松地查询Solr以获取相关的文档,但是,我认为您不能轻易获得这样的结果。
您可能会尝试使用FunctionQueries将其构建为返回的字段,请查看 ms 部分,但我不确定您是否可以实现它,如果您这样做,它将会有一个非常复杂的功能...
当然,您可以随时在客户端计算重叠范围。
答案 2 :(得分:1)
查看Chris Hostetter的幻灯片,Spatial Search Tricks for People Who Don't Have Spatial Data
Solr wiki中还有doc:SpatialForTimeDurations
外卖是你可以在X,Y坐标系中表示时间,而Solr会告诉你“盒子”是否重叠。它不是超级直观,但它是一个很酷的技巧。
答案 3 :(得分:0)
这是Solr DateRangeField旨在支持的具体内容,但您可能必须至少升级到Solr 1.5才能获得它。范围的两端都被索引为字段中的单个值。支持多个范围(值)。
Solr的DateRangeField支持相同的时间点语法语法 如上所述(具有下面描述的日期数学)和更多表达 日期范围。一类示例是截断日期,其中 表示指示精度的整个日期跨度。另一个 class使用范围语法([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。