Php Lucene中的范围查询
我正在使用Lucene和PHP来构建我的搜索引擎。现在索引的每个文档都有三个字段:Php Lucene中的范围查询,php,lucene,Php,Lucene,我正在使用Lucene和PHP来构建我的搜索引擎。现在索引的每个文档都有三个字段:title、startTime和finishTime。通过PHP web界面,我可以知道用户的当前时间。作为对用户查询的响应,我希望当且仅当用户的当前时间在所检索文档的startTime和finishTime字段之间时,检索文档 我是Lucene的新手。所以我想知道在Lucene有没有办法做到这一点。谢谢。首先,确保startTime和finishTime是整数值,最好是数字UNIX时间或刻度计数。如果使用诸如“M
title
、startTime
和finishTime
。通过PHP web界面,我可以知道用户的当前时间。作为对用户查询的响应,我希望当且仅当用户的当前时间在所检索文档的startTime
和finishTime
字段之间时,检索文档
我是Lucene的新手。所以我想知道在Lucene有没有办法做到这一点。谢谢。首先,确保
startTime
和finishTime
是整数值,最好是数字UNIX时间或刻度计数。如果使用诸如“MM/dd/yyyy”之类的字符串日期表示,则它将不起作用
您的查询可以重新表述为“其中startTime小于现在,finishTime大于现在”。这可以像这样转换为Lucene的查询语法(其中555
是当前的时间戳值):
(其中0
和999
分别是最小和最大界限值)
请注意,如果要添加其他术语,则需要将这两个范围谓词用括号分组,还请注意Lucene默认为“OR”,而不是“and”
此处提供了语法参考:
在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“简短”格式也可以(“20130328 144734”或类似的格式)。先生,您的意思是用户时间与unix时间戳的格式相同。但是,主席先生,在数据库中,这些时间,即开始时间和结束时间是固定的,格式是hh:mm,比如说,开始时间=上午10:00,结束时间=上午12:00。因此,在查询时,我还必须将数据库中的时间转换为unix时间戳。但在lucene,我该怎么做?如果我将这些startTime和finishtime作为unix时间戳值存储在数据库中,那么用户时间戳将永远不会出现在它们之间,因为用户的时间戳是最近的时间戳。主席先生,如果我的理解有误,请澄清。我的错误是,我认为时间
指的是历史上的某一特定点(即“日期-时间”值,而不是“一天中的时间”值),但无论如何,该方法仍然有效。构建Lucene文档时,将时间从“hh:mm tt”转换为秒数(hh*60*60)+(mm*60)
,搜索策略仍然有效。
$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);