sulin LuceneNet 搜索二

1.添加引用dll

using Lucene.Net.Search;
using Lucene.Net.Analysis.PanGu;
using PanGu;
using PanGu.HighLight;
using Lucene.Net.Documents;
using Lucene.Net.Store;
using Lucene.Net.Index;
using Lucene.Net.QueryParsers;

2.查询代码

  1  /// <summary>
  2         /// 从索引搜索结果
  3         /// </summary>
  4         private void SearchIndex()
  5         {
  6             Dictionary<string, string> dic = new Dictionary<string, string>();
  7             BooleanQuery bQuery = new BooleanQuery();
  8             CachingWrapperFilter filter = null;
  9             TermQuery query2 = null;
 10             string title = string.Empty;
 11             string content = string.Empty;
 12             if ((Request["title"] != null && Request["title"].ToString() != "") || !string.IsNullOrEmpty(txtTitle))
 13             {
 14                 string searchkey = Request["title"]==null?"":Request["title"].ToString();
 15                 if(!string.IsNullOrEmpty(txtTitle)){
 16                     searchkey=txtTitle;
 17                 }
 18                 foreach (string word in GetKeyWordsSplitBySpace(searchkey))
 19                 {
 20                     query2 = new TermQuery(new Term("Title", word));
 21                     bQuery.Add(query2, BooleanClause.Occur.SHOULD);//这里设置 条件为Or关系
 22                     query2 = new TermQuery(new Term("SimpleDesc", word));
 23                     bQuery.Add(query2, BooleanClause.Occur.SHOULD);//这里设置 条件为Or关系
 24                     query2 = new TermQuery(new Term("Tags", word));
 25                     bQuery.Add(query2, BooleanClause.Occur.SHOULD);//这里设置 条件为Or关系
 26                     //query2 = new TermQuery(new Term("ContextDesc", word));
 27                     //bQuery.Add(query2, BooleanClause.Occur.SHOULD);//这里设置 条件为Or关系
 28                 }
 29                 dic.Add("Title", searchkey);
 30                 dic.Add("SimpleDesc", searchkey);
 31                 txtTitle = searchkey;
 32                
 33                 if(this.hfradchecked.Value!="全部"){
 34                     //TermQuery query1 = new TermQuery(new Term("Types", this.hfradchecked.Value));
 35                     txttype = this.hfradchecked.Value;
 36                     query2 = new TermQuery(new Term("Types", this.hfradchecked.Value.ToString()));
 37                     QueryWrapperFilter oldFilter = new QueryWrapperFilter(query2);
 38                     filter = new CachingWrapperFilter(oldFilter);
 39                    
 40                 }
 41                 if (bQuery != null && bQuery.GetClauses().Length > 0)
 42                 {
 43                     GetSearchResult(bQuery, dic, filter);
 44                 }
 45             }
 46            
 47            
 48         }
 49         /// <summary>
 50         /// 获取
 51         /// </summary>
 52         /// <param name="bQuery"></param>
 53         private void GetSearchResult(BooleanQuery bQuery, Dictionary<string, string> dicKeywords, CachingWrapperFilter filter)
 54         {
 55             try
 56             {
 57                 //IndexSearcher search = new IndexSearcher(IndexDic, true);
 58                 FSDirectory directory = FSDirectory.Open(new DirectoryInfo(IndexDic), new NoLockFactory());
 59                 IndexReader reader = IndexReader.Open(directory, true);
 60                 //IndexSearcher是进行搜索的类
 61                 IndexSearcher search = new IndexSearcher(reader);
 62                 Stopwatch stopwatch = Stopwatch.StartNew();
 63                 //SortField构造函数第三个字段true为降序,false为升序
 64                 Sort sort = new Sort(new SortField("UploadTime", SortField.DOC, true));
 65                 TopDocs docs = search.Search(bQuery, filter, PageSize * PageIndex, sort);
 66                 stopwatch.Stop();
 67                 if (docs != null && docs.totalHits > 0)
 68                 {
 69                     lSearchTime = stopwatch.ElapsedMilliseconds;
 70                     txtPageFoot = GetPageFoot(PageIndex, PageSize, docs.totalHits, "sabrosus");
 71                     for (int i = 0; i < docs.totalHits; i++)
 72                     {
 73                         if (i >= (PageIndex - 1) * PageSize && i < PageIndex * PageSize)
 74                         {
 75                             Document doc = search.Doc(docs.scoreDocs[i].doc);
 76                             ResourcesModel model = new ResourcesModel()
 77                             {
 78                                 ID = doc.Get("ID").ToString(),
 79                                 Title = doc.Get("Title").ToString(),
 80                                 Tags = doc.Get("Tags").ToString(),
 81                                 CreaetBy = doc.Get("CreaetBy").ToString(),
 82                                 UploadTime = doc.Get("UploadTime").ToString(),
 83                                 Types = doc.Get("Types").ToString(),
 84                                 SimpleDesc = doc.Get("SimpleDesc").ToString(),
 85                                 ContextDesc = doc.Get("ContextDesc").ToString()
 86                             };
 87                             list.Add(SetHighlighter(dicKeywords, model));
 88                         }
 89                     }
 90                 }
 91             }
 92             catch (Exception ex)
 93             {
 94                 LogHelper.SaveLogError("",ex.ToString());
 95                 
 96             }
 97            
 98         }
 99 
100         /// <summary>
101         /// 处理关键字为索引格式
102         /// </summary>
103         /// <param name="keywords"></param>
104         /// <returns></returns>
105         private string[] GetKeyWordsSplitBySpace(string keywords)
106         {
107             PanGuTokenizer ktTokenizer = new PanGuTokenizer();
108             StringBuilder result = new StringBuilder();
109             List<string> listarry = new List<string>();
110             ICollection<WordInfo> words = ktTokenizer.SegmentToWordInfos(keywords);
111 
112             foreach (WordInfo word in words)
113             {
114                 if (word == null)
115                 {
116                     continue;
117                 }
118                 listarry.Add(word.Word);
119             }
120             return listarry.ToArray(); 
121         }
122 
123         /// <summary>
124         /// 设置关键字高亮
125         /// </summary>
126         /// <param name="dicKeywords">关键字列表</param>
127         /// <param name="model">返回的数据模型</param>
128         /// <returns></returns>
129         private ResourcesModel SetHighlighter(Dictionary<string, string> dicKeywords, ResourcesModel model)
130         {
131             SimpleHTMLFormatter simpleHTMLFormatter = new PanGu.HighLight.SimpleHTMLFormatter("<font color="red">", "</font>");
132             Highlighter highlighter = new PanGu.HighLight.Highlighter(simpleHTMLFormatter, new Segment());
133             highlighter.FragmentSize = 50;
134             string strTitle = string.Empty;
135             string strContent = string.Empty;
136             string Title = model.Title;
137             string SimpleDesc = model.SimpleDesc;
138             dicKeywords.TryGetValue("Title", out strTitle);
139             dicKeywords.TryGetValue("SimpleDesc", out strContent);
140             
141             if (!string.IsNullOrEmpty(strTitle))
142             {
143                 model.Title = highlighter.GetBestFragment(strTitle, model.Title);
144                 if (model.Title == "" || model.Title==null)
145                 {
146                     model.Title = Title;
147                 }
148             }
149           
150             if (!string.IsNullOrEmpty(strContent))
151             {
152                 model.SimpleDesc = highlighter.GetBestFragment(strContent, model.SimpleDesc);
153                 if (model.SimpleDesc == "" || model.SimpleDesc == null)
154                 {
155                     model.SimpleDesc = SimpleDesc;
156                 }
157                 model.SimpleDesc = GetContextSubstring(model.SimpleDesc, 200);
158             }
159             return model;
160         }
View Code
原文地址:https://www.cnblogs.com/linsu/p/4939573.html