Lucene全文检索-从零开始(3)

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     }

随便检索一条数据

按照常理,我们的数据是有变动的,比如新增数据,对数据的修改、删除。那我们的索引也要随着这些操作而改变,从而保证整个系统数据的一致性。

原文地址:https://www.cnblogs.com/smilejeffery/p/5915453.html