Lucene中的范围查询

时间:2013-03-25 06:07:41

标签: php lucene

我正在使用Lucene和PHP来构建我的搜索引擎。现在索引的每个文档都有三个字段:titlestartTimefinishTime。使用PHP Web界面,我可以知道用户的当前时间。为了响应用户查询,当且仅当用户的当前时间介于检索到的文档的startTimefinishTime字段之间时,我希望检索文档。

我是Lucene的新手。所以我想知道Lucene有什么方法可以做到这一点。谢谢。

2 个答案:

答案 0 :(得分:1)

首先,确保startTimefinishTime是整数值,理想情况下是数字UNIX时间或滴答计数。如果您使用字符串日期表示,如“MM / dd / yyyy”,那么它将无效。

您的查询可以改为“其中startTime小于现在,并且finishTime大于现在”。这可以转换成Lucene的查询语法,如下所示(其中555是当前时间戳值):

startTime:[0 TO 555] AND finishTime:[555 TO 999]

(其中0999分别是最小和最大边界值)

请注意,如果您要添加其他术语,则需要使用括号对这两个范围谓词进行分组,并注意Lucene默认为“OR”而不是“AND”。

此处提供语法参考:http://lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.html#Range%20Searches

在PHP中你会这样做:

$userTime = getUserTime(); // this must be an integer numeric value.
$max = mktime(23,59,59, 12,31,2099); // generates an upperbound timestamp

$query = "startTime:[0 TO %1$d] AND finishTime:[%1$d TO %2$d]";
$query = sprintf($query, $userTime, $max);

然后将$query提交给您的Lucene搜索。

答案 1 :(得分:0)

转换为ISO 8601“简要”格式也适用(“20130328T144734”或某些)。