摘要:Lucene.Net 使用 TermRangeQuery 進行日期搜尋
當我們在使用SQL 搜尋時常會搜尋某個日期範圍的資料 ,
下面的 Sample 將會 DEMO 如何以 Lucene.Net 的 TermRangeQuery 方法 來達成目的
Lucene.Net 的 TermRangeQuery API 介紹如下 :
This query matches the documents looking for terms that fall into the supplied range according to CompareTo. It is not intended for numerical ranges, use NumericRangeQuery(T) instead.
若是需要求取數字之間的區間 , 可以使用 NumericRangeQuery 方法
使用 sample 如下 :
Query q = new TermRangeQuery("PROD_ProduceDay", "20130921", "20130925", true, true);
// TermRangeQuery (欄位名稱, 最小值,最大值, 是否包含最小值, 是否包含最大值
Step 1 : Build RAMDirectory
static RAMDirectory dir = new RAMDirectory();
Step 2 : Build Index
我們在這增加了一個欄位 PROD_ProduceDay [ 產品生產日期 ]
private void BuildIndex()
{
IndexWriter iw = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), true, IndexWriter.MaxFieldLength.UNLIMITED);
Document doc = new Document();
doc.Add(new Field("PROD_ID","",Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.NO));
doc.Add(new Field("PROD_Name", "", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
doc.Add(new Field("PROD_ProduceDay","", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
for (int i = 1; i <= 10; i++)
{
doc.GetField("PROD_ID").SetValue( Guid.NewGuid().ToString());
doc.GetField("PROD_Name").SetValue("Lucene.Net" + i.ToString());
doc.GetField("PROD_ProduceDay").SetValue(DateTime.Now.AddDays(i).ToString("yyyyMMdd"));
iw.AddDocument(doc);
}
iw.Optimize();
iw.Commit();
iw.Close();
}
Step 3 : 搜尋 生產日期在 21 號 ~ 25 號的所有產品
private void SearchIndex()
{
IndexSearcher search = new IndexSearcher(dir, true);
QueryParser qp = new QueryParser(Version.LUCENE_30, "PROD_ProduceDay", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30));
Query q = new TermRangeQuery("PROD_ProduceDay", "20130921", "20130925", true, true);
var hits = search.Search(q, null, search.MaxDoc).ScoreDocs;
foreach (var res in hits)
{
Response.Write(string.Format("PROD_ID:{0} / PROD_Name{1} / PROD_ProduceDay {2}", search.Doc(res.Doc).Get("PROD_ID").ToString()
, search.Doc(res.Doc).Get("PROD_Name").ToString()
, search.Doc(res.Doc).Get("PROD_ProduceDay").ToString() + "
"));
}
}
Result :
PROD_ID:091b6ed6-0cb4-484c-83d1-7b190814efaf / PROD_NameLucene.Net1 / PROD_ProduceDay 20130921
PROD_ID:bf960b00-1882-4b33-880d-82c17b95efe3 / PROD_NameLucene.Net2 / PROD_ProduceDay 20130922
PROD_ID:a2984e34-54ba-485f-9ace-6d79d34dfbde / PROD_NameLucene.Net3 / PROD_ProduceDay 20130923
PROD_ID:8f9913c9-a51c-4d70-89cf-6f4de90bad1c / PROD_NameLucene.Net4 / PROD_ProduceDay 20130924
PROD_ID:d10a0fee-8fbe-4e48-ab46-35740a2150df / PROD_NameLucene.Net5 / PROD_ProduceDay 20130925