1.传入要检索的关键字和需要检索的字段
1 /// <Contents> 2 /// 全文检索 3 /// </Contents> 4 /// <param name="keyword">关键词</param> 5 /// <param name="field">搜索字段</param> 6 public List<China.Model.LuceneIndexArticle> SearchIndex(string keyword, List<string> field) 7 { 8 Dictionary<string, string> dic = new Dictionary<string, string>(); 9 BooleanQuery bQuery = new BooleanQuery(); 10 foreach (string str in field) 11 { 12 string key = GetKeyWordsSplitBySpace(keyword);//处理搜索词 13 QueryParser parse = new QueryParser(str, PanGuAnalyzer);//盘古分词 14 Query query = parse.Parse(key); 15 parse.SetDefaultOperator(QueryParser.Operator.AND); 16 bQuery.Add(query, BooleanClause.Occur.SHOULD); 17 dic.Add(str, keyword); 18 } 19 if (bQuery != null && bQuery.GetClauses().Length > 0) 20 { 21 return GetSearchResult(bQuery, dic, keyword); 22 } 23 else 24 { 25 return null; 26 } 27 }
2.获取搜索结果
1 /// <Contents> 2 /// 获取搜索结果 3 /// </Contents> 4 /// <param name="bQuery"></param> 5 public List<China.Model.LuceneIndexArticle> GetSearchResult(BooleanQuery bQuery, Dictionary<string, string> dicKeywords, string keyword) 6 { 7 //打开索引位置 8 IndexSearcher search = new IndexSearcher(IndexDic, true); 9 //运行时间 10 Stopwatch stopwatch = Stopwatch.StartNew(); 11 TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); 12 search.Search(bQuery, null, collector);//根据query查询条件进行查询,查询结果放入collector容器 13 //TopDocs 指定0到GetTotalHits() 即所有查询结果中的文档 如果TopDocs(20,10)则意味着获取第20-30之间文档内容 达到分页的效果 14 ScoreDoc[] docs = collector.TopDocs(0, collector.GetTotalHits()).scoreDocs; 15 List<China.Model.LuceneIndexArticle> list = new List<China.Model.LuceneIndexArticle>(); 16 ///TopDocs docs = search.Search(bQuery, (Filter)null, 1000); 17 stopwatch.Stop(); 18 //搜索结果条数 19 count = docs.Length; 20 if (docs != null && docs.Length > 0) 21 { 22 //运行时间 23 lSearchTime = stopwatch.ElapsedMilliseconds; 24 foreach (ScoreDoc sd in docs) 25 { 26 Document doc = search.Doc(sd.doc); 27 string title = doc.Get("Title"); 28 string content = doc.Get("Contents"); 29 China.Model.LuceneIndexArticle ar = new China.Model.LuceneIndexArticle(); 30 { 31 ar.ID = Convert.ToInt32(doc.Get("ID")); 32 ar.Title = doc.Get("Title").ToString(); 33 ar.Contents = ReplaceHtmlTag(doc.Get("Contents").ToString()); 34 }; 35 PanGu.HighLight.SimpleHTMLFormatter simpleHTMLFormatter = new PanGu.HighLight.SimpleHTMLFormatter("<font color="red">", "</font>"); 36 PanGu.HighLight.Highlighter highlighter = new PanGu.HighLight.Highlighter(simpleHTMLFormatter, new PanGu.Segment()); 37 highlighter.FragmentSize = 200; 38 string Contentshighlight = highlighter.GetBestFragment(keyword, ar.Contents); 39 string titlehighlight = highlighter.GetBestFragment(keyword, ar.Title); 40 if (Contentshighlight == "") 41 { 42 if (ar.Contents.Length > 200) 43 { 44 ar.Contents = ar.Contents.Substring(0, 200); 45 } 46 else 47 { 48 ar.Contents = ar.Contents.Substring(0, ar.Contents.Length); 49 } 50 } 51 else 52 { 53 ar.Contents = Contentshighlight; 54 } 55 if (titlehighlight != "") ar.Title = titlehighlight; 56 list.Add(ar); 57 } 58 } 59 return list; 60 }
随便检索一条数据
按照常理,我们的数据是有变动的,比如新增数据,对数据的修改、删除。那我们的索引也要随着这些操作而改变,从而保证整个系统数据的一致性。