2012-10-05

[C#] Lucene.net 日期範圍搜尋

 

筆記一下,因為之前都是做關鍵字搜尋,其實國外有人寫過範圍搜尋範例,

我只是小咖,只是他們加入許許多多條件,花了一點時間才搞懂,這方法不一定是最好的..

但是至少解決我暫時遇到的範圍搜尋..

public List<Dict> SearchDateRangeSample(string searchContent)
{
 
        DirectoryInfo dirInfo = new DirectoryInfo(ArticlePath);
        FSDirectory dir = FSDirectory.Open(dirInfo);
        IndexSearcher  search = new IndexSearcher(dir, true);
 
        List<Dict> lst = new List<Dict>();
        Filter f=new RangeFilter("DateField", "20120101","20120622",true,true);
        Query q = new MatchAllDocsQuery();
        FilteredQuery filteredQuery = new FilteredQuery(q, f);
 
 
        Hits hits = search.Search(filteredQuery, f);
 
        
        for (int i = 0; i < hits.Length(); i++)
        {
            Dict dm = new Dict();
            dm.Tag = hits.Doc(i).GetField("Tag").StringValue();
            dm.Id = hits.Doc(i).GetField("Id").StringValue();
 
            dm.Date1 = DateTime.ParseExact(hits.Doc(i).GetField("Date1").StringValue(), "yyyyMMdd", CultureInfo.InvariantCulture);
            lst.Add(dm);
        }
 
        return lst;
 
 
}

 

Dict 只是我訂立的物件名稱,暫時先不用看他


 

 

其中..

 
        Filter f=new RangeFilter("DateField", "20120101","20120622",true,true);

 

 

這Filter 使用 RangeFilter 並且決定 起始值為 20120101 最大為 20120622 後面兩個 true 的意思是 搜尋時也包含 最大跟最小值 不要忽略…

當然時間的部分,我在做index 的時候 編碼為 yyyyMMdd 方便我進行搜尋...

 

這樣很簡單幾行來實現範圍搜尋…

 

之後期更詳細的解說做法 請參考 此篇 

[C#] Lucene.net–透過 TermRangeQuery 進行日期搜尋