時間區間匹配(附帶Lucene查詢的C 實現)

2021-08-22 07:20:47 字數 1771 閱讀 2800

考慮情形,假設資料庫有記錄一件事情開始的時間和結束的時間的表。現在需要對其進行檢索,要求查詢某一時間段內的資料,只要和時間區間有交集就符合檢索條件。那麼,總共可能出現6種情況(如圖)。

相交的有4中情況,要實現匹配可以做以簡單歸納,有兩種實現考慮:

starttst `et `之間)與 (st `starttendt之間)

et `<startt)或(st `>endt),然後對這一整個表示式取反

public query getqueryofseastr(iheaderdictionary keyvaluepairs)

/****************************時間間隔匹配篩選設定********************************/

datetime qssj = keyvaluepairs.getvalue("qssj");//獲取起始時間

datetime jssj = keyvaluepairs.getvalue("jssj");//獲取結束時間

//一種情況,start在qssj和jssj之間

var rangequery_1 = numericrangequery.newint64range("start", qssj.tofiletimeutc(), jssj.tofiletimeutc(), true, true);

//一般涉及到的時間不超過這個區間,權且這樣設定時間界限

datetime min = new datetime(1700, 1, 1, 0, 0, 0); //最小時間界限

datetime max = new datetime(2999, 12, 31, 23, 59, 59); //最大時間界限

//另一種情況,jssj在start和end之間

var rangequery_2_1 = numericrangequery.newint64range("start", min.tofiletimeutc(), jssj.tofiletimeutc(), false, true);

var rangequery_2_2 = numericrangequery.newint64range("end", qssj.tofiletimeutc(), max.tofiletimeutc(), true, false);

//設定情況1為&

booleanquery queryand_1 = new booleanquery

};//設定情況2為&

booleanquery queryand_2 = new booleanquery,};

//設定情況1||情況2,至此完成了最終的時間區間匹配篩選

booleanquery queryor_1 = new booleanquery,};

booleanquery re = new booleanquery,};

return re;

}

第一次寫,有不對之處還望指出。源**可以可參看搜尋「lucene時間區間」,希望多多支援原創。

Lucene實用的分詞匹配

本篇主要說乙個lucene使用多個條件同時匹配的情況,如圖所示 這個檢索表示四個條件同時滿足的結果,其中分類關鍵categoryname這個唯一字段,年級與科目比較複雜,它們兩個同時關聯propertyname欄位,字段內容用 分割,關鍵字它關鍵所有字段,在web專案中,首先需要對年級與科目進行處理...

thinkphp6的時間區間查詢

thinkphp6之後 就沒辦法在使用thinkphp5的時間查詢方法了 這裡有thinkphp6自帶的方法 thinkphp6查詢表示式官方文件鏈結 date 2020 06 01 00 00 00 首先先宣告乙個開始時間 然後將日期格式的時間轉成時間戳 begintime strtotime d...

Lucene的組合查詢

在lucene中實現組合查詢的方法很多,我目前用過的方法有三種,使用multifieldqueryparser,使用filter,使用boolean query。1.使用multifieldqueryparser 構建parser的時候使用multifieldqueryparser,查詢時便可以同時...