2013-03-25 182 views
0

我正在使用Lucene和PHP構建我的搜索引擎。現在每個索引文件有三個字段:title,startTimefinishTime。通過PHP Web界面,我可以知道用戶的當前時間。當且僅當用戶當前時間在該檢索文檔的startTimefinishTime字段之間時,纔回應用戶查詢,我希望檢索文檔。Lucene中的範圍查詢

我是Lucene的新手。所以我想知道在Lucene中有沒有辦法可以做到這一點。謝謝。

回答

1

首先,確保startTimefinishTime是整數值,理想情況下是數字UNIX時間或滴答計數。如果你使用像「MM/dd/yyyy」這樣的字符串日期表示,那麼它將不起作用。

您的查詢可以改爲「where startTime小於now,finishTime大於now」。這可以轉換成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搜索。

+0

先生,你的意思是userTime的格式也與unix時間戳相同。但是,先生,在數據庫中,這些時間,即startTime和finishTime是固定的,格式爲hh:mm,比如startTime = 10:00 am和finishTime = 12:00 am。所以在查詢時,我還必須將數據庫中的這些時間轉換爲unix時間戳。但是在lucene中,我該怎麼做呢?如果我將那些startTime和finishTimes作爲unix時間戳值存儲在數據庫中,則用戶時間戳不會在它們之間發生,因爲用戶的時間戳是最近的時間戳記。主席先生,如果我的理解錯誤,請澄清我。 – Joy 2013-03-25 07:22:46

+1

我的錯誤是,我認爲「時間」是指歷史中的一個特定點(即「日期 - 時間」值,而不是「時間」值),但無論如何該方法仍然有效。在構建Lucene文檔時,將時間從「hh:mm tt」轉換爲秒數「(HH * 60 * 60)+(mm * 60)」,搜索策略仍然有效。 – Dai 2013-03-25 07:54:04

0

轉換爲ISO 8601「簡要」格式也可以工作(「20130328T144734」或其他)。