2012-09-17 48 views
5

我正在使用http api查询ravendb(所以LINQ查询不是我的问题的解决方案)。 我的产品文件看起来是这样的:如何使用Lucene查询包含日期的ravendb索引?

{ 
    "editDate": "2012-08-29T15:00:00.846Z" 
} 

和我有指数:

from doc in docs.Product 
select new { doc.editDate } 

我想一定日期和时间之前查询所有文件。我可以使用以下语法在DATE查询:

editDate: [NULL TO 2012-09-17] 

但是我不知道如何查询时间组件。 有什么建议吗?

回答

5

可以查询,使用:

editDate: [NULL TO 2012-09-17T15:00:00.846Z] 

如果你关心其中的一部分,使用方法:

editDate: [NULL TO 2012-09-17T15:00] 

注意,你可能有逃避查询的部分,像这样:

editDate: [NULL TO 2012\-09\-17T15\:00] 

对于这个也行你需要确保对该字段进行分析。 在Raven Studio中 - 添加字段 - > editDate,并将索引设置为Analyzed。

+0

是的,它需要逃脱,但这仍然不适用于我。如果日期较长(2012-09-18T15:00),则会找到该文档,但如果是同一天但在当天晚些时候(2012-09-17T15:30),则找不到该文档。 –

+0

想通了 - 需要对字段进行分析,你如何使用http api设置它? (在文档中找不到) –

+0

这是不好的建议。日期字段不应该被分析。 –

-1

解决此问题的一种方法是将该值不是作为日期存储,而是作为自UNIX时期以来的秒数。

这会产生一个数字,您可以轻松地进行比较。

我使用JavaScript和时刻JS库:

{ 
    "editDate": "2012-08-29T15:00:00.846Z", 
    "editDateUnix": moment("2012-08-29T15:00:00.846Z").unix() 
} 

我的任何指标:

from doc in docs.Product 
select new { doc.editDate, doc.editDateUnix } 

,我的Lucene的查询:

"editDate: [NULL TO "+moment("2012-09-17").unix()+"]" 
+0

这是否解决您的问题,或者你在寻找更多的答案? – MattDavey

+0

它确实解决了它,但是如果有另一种方法来做到这一点,那么我很想知道它是什么! –