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);
當設定 三個字結果 phraseQuery.SetSlop(3);
當設定 四個字結果 phraseQuery.SetSlop(4);
中間我把一些值得注意的 標示起來
這樣就不用 Regular Expression 去 parse.