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 }