Lucene.Net 使用HighLight

摘要: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);
        }

       

    }