Lucene.Net 使用 TermRangeQuery 進行日期搜尋

摘要: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