Lucene.Net.Analysis;
 Lucene.Net.Search;
  6  Model.HelperModel;
  9  System.Collections.Generic;
 10 
 11  12  13      SearchBLL
 14  15         一个类中可能会有多处输出到日志,多处需要记录日志,常将logger做成static 静态变量
 日志助手
 18          19          索引保存位置
 23          24          25          搜索
 26          27         <param name="keywords">用户搜索的关键词 28         <returns>返回搜索的结果</returns>
 29         static List<SearchResult> Search( keywords)
 30  31              32  33                  34                 FSDirectory directory = FSDirectory.Open( NoLockFactory());
 35                 创建IndexReader对象
 36                 IndexReader reader = IndexReader.Open(directory,1)">true 37                 创建IndexSearcher对象
 38                 IndexSearcher searcher =  IndexSearcher(reader);
 39                 新建PhraseQuery 查询对象
 40                 PhraseQuery query =  PhraseQuery();
把用户输入的关键词进行拆词
 42                 foreach (string word in SplitWord(keywords))
 43  44                     添加搜索关键词
 45                     query.Add( 46 设置分词间距为100字之内
 48                 query.SetSlop(100 49                 TopScoreDocCollector collector = TopScoreDocCollector.create(1000,1)">根据查询条件查询结果
 51                 searcher.Search(query,1)">null搜索到的ScoreDoc结果
 53                 ScoreDoc[] docs = collector.TopDocs(0 54                 保存搜索结果的list
 55                 List<SearchResult> listResult = new List<SearchResult>();
 56                 for (int i = 0; i < docs.Length; i++)
 57  58                     取到文档的编号(主键,这个是Lucene .net分配的)
 59                     检索结果中只有文档的id,如果要取Document,则需要Doc再去取
 60                     降低内容占用
 61                     int docId = docs[i].doc;
 62                     根据id找Document
 63                     Document doc = searcher.Doc(docId);
 64                     string number = doc.Get( 65                     string title = doc.Get( 66                     string body = doc.Get( 67                     string url = doc.Get( 68                     建立一个搜索结果对象
 69                     SearchResult result =  SearchResult();
 70                     result.Number = number;
 71                     result.Title = title;
 72                     result.BodyPreview = Preview(body,keywords);
 73                     result.Url = url;
 74                     添加到结果列表
                    listResult.Add(result);
 76  77                 if (listResult.Count ==  78  79                     return  80  81                 else
 83                     return listResult;
 84  85  86              87  88  89                  90  91              92  93  95  96  97 
 98          99          获取内容预览
100         101         <param name="body">内容102         <param name="keyword">关键词103         <returns></returns>
104         private string Preview(string body,1)"> keyword)
105 106             创建HTMLFormatter,参数为高亮单词的前后缀 
107             PanGu.HighLight.SimpleHTMLFormatter simpleHTMLFormatter = new PanGu.HighLight.SimpleHTMLFormatter(<font color="red">",</font>108             创建 Highlighter ,输入HTMLFormatter 和 盘古分词对象Semgent 
109             PanGu.HighLight.Highlighter highlighter = new PanGu.HighLight.Highlighter(simpleHTMLFormatter,1)"> PanGu.Segment());
110             设置每个摘要段的字符数 
111             highlighter.FragmentSize = 112             获取最匹配的摘要段 
113             string bodyPreview = highlighter.GetBestFragment(keyword,body);
114              bodyPreview;
115 116 
117         118          盘古分词,对用户输入的搜索关键词进行分词
119         120         <param name="str">用户输入的关键词121         分词之后的结果组成的数组122         string[] SplitWord( str)
123 124             List<string> list = new List<string>125             Analyzer analyzer =  PanGuAnalyzer();
126             TokenStream tokenStream = analyzer.TokenStream("",1)"> System.IO.StringReader(str));
127             Lucene.Net.Analysis.Token token = 128             while ((token = tokenStream.Next()) != 129 130                 list.Add(token.TermText());
131 132              list.ToArray();
133 134 135 }