2012-10-04

[C#]Lucene.net–跨字搜尋(詞組搜尋) PhraseQuery

 

PhraseQuery 詞組搜尋,主要是可以達到跨字數範圍搜尋,

舉例來說 假設 你希望找尋 我…你 中間可能模糊範圍在 3 個字以內..

這時候要使用 PhraseQuery
PhraseQuery phraseQuery = new PhraseQuery();

// 其中  3 這數字代表 允許中間的插入數值 為三個字

phraseQuery.SetSlop(3);

// 搜尋 Memo 此欄位 出現 我 還有 你 中間間最多三個字..

phraseQuery.Add(new Term("Memo", "我"));
phraseQuery.Add(new Term("Memo", "你"));

完整 C#  Code:

// 啟用監看
Stopwatch sw = new Stopwatch();
sw.Start();
 
// 讀取索引
string indexPath = AppDomain.CurrentDomain.BaseDirectory.ToString() + "\\Index5\\";
DirectoryInfo dirInfo = new DirectoryInfo(indexPath);
FSDirectory dir = FSDirectory.Open(dirInfo);
IndexSearcher search = new IndexSearcher(dir, true);
 
PhraseQuery phraseQuery = new PhraseQuery();
 
phraseQuery.SetSlop(3);
 
phraseQuery.Add(new Term("Memo", txtKW1.Text));
phraseQuery.Add(new Term("Memo", txtKW2.Text));
 
Sort sort = new Sort(new SortField("Id", 4));
 
// 開始搜尋
var hits = search.Search(phraseQuery, null, search.MaxDoc(), sort).ScoreDocs;
 
sw.Stop();
Response.Write("花費時間:" + sw.Elapsed + "<br /><hr />");
Response.Write("資料比數:" + hits.Length + "<br /><hr />");
Response.Write("Result:<br />");
 
foreach (var res in hits)
{
 
    Response.Write("Id:" + search.Doc(res.doc).Get("Id") + "  BirthDay=" + search.Doc(res.doc).Get("BirthDay") + "  Memo=" + search.Doc(res.doc).Get("Memo").Replace(txtKW1.Text, "<span style='color:red'>" + txtKW1.Text + "</span>").Replace(txtKW2.Text, "<span style='color:red'>" + txtKW2.Text + "</span>") + "<br />");
}

當設定  兩個字結果 phraseQuery.SetSlop(2);


sshot-80_thumb


 


當設定 三個字結果 phraseQuery.SetSlop(3);


sshot-78_thumb


當設定 四個字結果 phraseQuery.SetSlop(4);


sshot-79_thumb


中間我把一些值得注意的 標示起來


這樣就不用 Regular Expression 去 parse.