使用lucene首先项目中要引用Lucene.Net.dll创建索引 using Lucene.Net.Documents; using Lucene.Net.Index; using Lucene.Net.Analysis.Standard; //建立索引 public IndexWriter CreateIndex() { string indexpath = Server.MapPath("dex"); //INDEX_STORE_PATH 为索引存储目录 IndexWriter writer = null; try { writer = new IndexWriter(indexpath, new StandardAnalyzer(), true); SqlDataReader myred = ExecuteQuery("select FaqSubject,FaqContent from csFAQ"); //建立索引字段 while (myred.Read()) { Document doc = new Document(); doc.Add(new Field("tablename", "csFAQ", Field.Store.YES, Field.Index.UN_TOKENIZED));//存储,不索引 doc.Add(new Field("FaqSubject", myred["FaqSubject"].ToString(), Field.Store.YES, Field.Index.TOKENIZED)); doc.Add(new Field("FaqContent", myred["FaqContent"].ToString(), Field.Store.YES, Field.Index.TOKENIZED)); //doc.Add(new Field("indexcontent", myred["FaqSubject"].ToString() + myred["FaqContent"].ToString(), Field.Store.NO, Field.Index.TOKENIZED));//不存储,索引,indexcontent实现了title和content,也就是标题和内容的索引 writer.AddDocument(doc); } myred.Close(); myred.Dispose(); // writer.Optimize(); writer.Close(); } catch (Exception ex) { Log.Error(ex); } return writer; } 3.根据索引搜索并且高亮显示,高亮显示需引入lucene.net源码中的一些文件 protected void btnSearch_Click(object sender, EventArgs e) { string INDEX_STORE_PATH = Server.MapPath("/dex"); //INDEX_STORE_PATH 为索引存储目录 string keyword = Request.Form["txtkeywork"].ToString(); Hits myhit = null; //搜索全文 IndexSearcher mysea = new IndexSearcher(INDEX_STORE_PATH); String[] fields={"FaqSubject","FaqContent"}; QueryParser q=new MultiFieldQueryParser(fields,new StandardAnalyzer()); Query query = q.Parse(keyword); myhit = mysea.Search(query); Tip = "关于:<font color='red'>" + keyword + "</font> 搜索到<font color='red'> " + myhit.Length() + " </font>个结果"; //高亮显示 SimpleHTMLFormatter shtml = new SimpleHTMLFormatter("<font color='red'>", "</font>"); Highlighter highlighter = new Highlighter(shtml,new QueryScorer(query)); if (myhit != null) { DataRow myrow; DataTable mytab = new DataTable(); mytab.Columns.Add("FaqSubject"); mytab.Columns.Add("FaqContent"); mytab.Clear(); if (myhit.Length() > 0) { for (int i = 0; i < myhit.Length(); i++) { Document doc = myhit.Doc(i); myrow = mytab.NewRow(); string title= doc.Get("FaqSubject").ToString(); string content= doc.Get("FaqContent").ToString(); //高亮显示内容字数设置 highlighter.SetTextFragmenter(new SimpleFragmenter(content.Length)); Analyzer analyzer=new StandardAnalyzer(); TokenStream tokenStream = analyzer.TokenStream("FaqSubject", new System.IO.StringReader(title)); TokenStream contentStream = analyzer.TokenStream("FaqContent", new System.IO.StringReader(content)); string resultTitle= highlighter.GetBestFragment(tokenStream, title); string resultContent = highlighter.GetBestFragment(contentStream, content); if (string.IsNullOrEmpty(resultTitle)) { resultTitle = title; } if (string.IsNullOrEmpty(resultContent)) { resultContent = content; } myrow[0] = resultTitle; myrow[1] = resultContent; mytab.Rows.Add(myrow); myrow.AcceptChanges(); } faqList.DataSource = mytab; faqList.DataBind(); divSearch.Style.Add("display", "block"); divAll.Style.Add("display", "none"); } else { divSearch.Style.Add("display", "none"); divAll.Style.Add("display", "block"); } } else { Tip="Hits为空"; } mysea.Close(); }