我正在使用 Lucene 和 PHP 来构建我的搜索引擎。现在索引的每个文档都有三个字段title
:startTime
和finishTime
。通过 PHP Web 界面,我可以知道用户的当前时间。为了响应用户查询,当且仅当用户的当前时间在检索到的文档的startTime
andfinishTime
字段之间时,我希望检索文档。
我是 Lucene 的新手。所以我想知道在 Lucene 中有什么方法可以做到这一点。谢谢你。
首先,确保startTime
和finishTime
是整数值,最好是数字 UNIX 时间或滴答计数。如果您使用像“MM/dd/yyyy”这样的字符串日期表示,那么它将不起作用。
您的查询可以改写为“startTime 小于 now,finishTime 大于 now”。这可以像这样转换为 Lucene 的查询语法(555
当前时间戳值在哪里):
startTime:[0 TO 555] AND finishTime:[555 TO 999]
(其中0
和999
分别是最小和最大界限值)
请注意,如果您要添加其他术语,您需要用括号对这两个范围谓词进行分组,并且还要注意 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 搜索。
转换为 ISO 8601“简要”格式也可以工作(“20130328T144734”或类似的)。