Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Lucene中的范围查询_Php_Lucene - Fatal编程技术网

Php Lucene中的范围查询

Php Lucene中的范围查询,php,lucene,Php,Lucene,我正在使用Lucene和PHP来构建我的搜索引擎。现在索引的每个文档都有三个字段:title、startTime和finishTime。通过PHP web界面,我可以知道用户的当前时间。作为对用户查询的响应,我希望当且仅当用户的当前时间在所检索文档的startTime和finishTime字段之间时,检索文档 我是Lucene的新手。所以我想知道在Lucene有没有办法做到这一点。谢谢。首先,确保startTime和finishTime是整数值,最好是数字UNIX时间或刻度计数。如果使用诸如“M

我正在使用Lucene和PHP来构建我的搜索引擎。现在索引的每个文档都有三个字段:
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);