摘要:Lucene.Net 使用HighLight
在 Lucene.Net 的 Contrib Library 有一個 Hightliter class ,
可以在搜尋結果中針對搜尋的字樣特別 Hight Light
Step 1 : Build RAMDirectory
public static RAMDirectory dir = new RAMDirectory();
Step 2 : Build Index
private 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_ID", "", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
doc.Add(new Field("PROD_Name", "", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
for (int i = 1; i <= 1000; i++)
{
doc.GetField("PROD_ID").SetValue(Guid.NewGuid().ToString());
doc.GetField("PROD_Name").SetValue("Lucene Net holmes has a very much money" + i.ToString());
iw.AddDocument(doc);
}
iw.Optimize();
iw.Commit();
iw.Close();
}
Step 3 : Search
private void SearchIndex(string keyWord)
{
IndexReader indexReader = IndexReader.Open(dir, true);
IndexSearcher search = new IndexSearcher(indexReader);
QueryParser qp = new QueryParser(Version.LUCENE_30, "PROD_Name", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30));
Query query = qp.Parse(keyWord);
var hits = search.Search(query, null, search.MaxDoc).ScoreDocs;
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("", "");
QueryScorer scorer = new QueryScorer(query, "PROD_Name");
var highlighter = new Highlighter(formatter, scorer);
highlighter.TextFragmenter = new SimpleFragmenter(9999);
foreach (var res in hits)
{
TokenStream stream = TokenSources.GetAnyTokenStream(search.IndexReader, res.Doc, "PROD_Name", new StandardAnalyzer(Version.LUCENE_30));
string strSnippet = highlighter.GetBestFragment(stream, search.Doc(res.Doc).Get("PROD_Name").ToString());
Response.Write(strSnippet);
}
}