摘要: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 的資料列都被過濾掉了