Lucene.Net 使用 Filter 過濾 Query 結果

摘要:Lucene.Net 使用 Filter 過濾 Query 結果

我們常可以看到網站的搜尋 , 在輸入關鍵字搜尋後都還有提供許多的過濾標籤提供過濾  , 

 

Filter 正是這種功用 , 與 Query 不同得是 , Query 提供相關性的搜尋 , 

 

而 Filter 則是提供精確的搜尋 

 

 

使用範例如下 : 

 

 

Step 1 : Build RAMDirectory 


 static RAMDirectory dir = new RAMDirectory();

 

Step 2 : Build Index


public 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_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 <= 9; i++)
        {
            doc.GetField("PROD_Name").SetValue("Lucene.Net");
            doc.GetField("PROD_ProduceDay").SetValue("2013020" + i.ToString());
            iw.AddDocument(doc);
        }

        iw.Optimize();
        iw.Commit();
        iw.Close();
    }

 

Step 3 : Search 

 

Line 8 將會搜尋 PROD_Name 為 Lucene.Net 的商品名稱 

 

而Line 10 會將搜尋結果過濾 , 只允許 20130201 ~ 20130207 的資料 

 


public void Search(string KeyWord)
    {

        IndexSearcher search = new IndexSearcher(dir, true);

        QueryParser qp = new QueryParser(Version.LUCENE_30, "PROD_Name", new StandardAnalyzer(Version.LUCENE_30));

        Query query = qp.Parse(KeyWord);

        Filter filter = new TermRangeFilter("PROD_ProduceDay", "20130201", "20130207", true, true);
        
        var hits = search.Search(query,null, search.MaxDoc).ScoreDocs;


        foreach (var res in hits)
        {
            Response.Write(string.Format("PROD_Name : {0} / PROD_ProduceDay : {1} "
                                        , search.Doc(res.Doc).Get("PROD_Name").ToString()
                                        , search.Doc(res.Doc).Get("PROD_ProduceDay").ToString() + "
"));
        }
    }

 

 

原本建立的資料集 :


PROD_Name : Lucene.Net / PROD_ProduceDay : 20130201
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130202
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130203
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130204
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130205
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130206
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130207
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130208
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130209

 

過濾後的資料集 : 


PROD_Name : Lucene.Net / PROD_ProduceDay : 20130201
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130202
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130203
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130204
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130205
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130206
PROD_Name : Lucene.Net / PROD_ProduceDay : 20130207

 

最後 20130208 和 20130209 的資料列都被過濾掉了