private List <Models.ViewSearchContentModel> SearchBookContent() { var indexPath = @"C:\Users\Victor\Desktop\LuceneNetDir"; var kw = Common.WebCommon.GetPanGuWord(Request["txtContent"]); FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory()); IndexReader reader = IndexReader.Open(directory, true); IndexSearcher searcher = new IndexSearcher(reader); //搜索条件 PhraseQuery query = new PhraseQuery(); foreach (var word in kw)//先用空格,让用户去分词,空格分隔的就是词"计算机 专业" { query.Add(new Term("body", word)); } //WITH_POSITIONS_OFFSETS -> 盘古分词在建立索引的时候已经将干扰词间距记录,lucene.net只要匹配就可以了 query.Slop = 100;//多个查询条件词之间的最大距离,在文章中相隔太远也就无意义(例如 “大学生”这个查询条件和“简历”这个查询条件之间如果间隔的词太多也就没有意义了。) //TopScoreDocCollector是盛放查询结果的容器 TopScoreDocCollector collector = TopScoreDocCollector.Create(1000, true); searcher.Search(query, null, collector); //根据query查询条件进行查询,查询结果放入cllector容器 ScoreDoc[] docs = collector.TopDocs(0, collector.TotalHits).ScoreDocs; //得到所有查询结果中的文档,collector.TotalHits:表示总条数;TopDocs(300,20):表示得到300(从300开始),到320(结束)的文档内容 var list = new List <Models.ViewSearchContentModel>(); //可以用来实现分页内容 for (int i = 0; i < docs.Length; i++) { //搜索ScoreDoc[]只能获得文档的id,这样不会把查询结果的Document一次性加载到内存中。降低了内存的压力,需要获得文档的详细内容的时候通过searcher.Doc来根据文档id来获得文档的详细内容对象document int docId = docs[i].Doc; //得到查询结果文档的id(Lucene内容分配的id) Document doc = searcher.Doc(docId); //找到文档id对应的文档详细信息 list.Add(new Models.ViewSearchContentModel { Id = doc.Get("Id"), Title = doc.Get("Title"), Content = Common.WebCommon.CreateHighLight(Request["txtContent"], doc.Get("Content"))//搜索内容关键字高亮显示 }); } SearchDetailsBll.AddEntity(new SearchDetails { Id = Guid.NewGuid(), KeyWords = Request["txtContent"], SearchDateTime = DateTime.Now, }); return(list); }
/// <summary> /// 获取页面视图模型 /// </summary> /// <param name="page"></param> /// <param name="size"></param> /// <param name="orderBy"></param> /// <param name="user"></param> /// <returns></returns> private async Task <IndexPageViewModel> GetIndexPageViewModelAsync(int page, int size, OrderBy orderBy, UserInfoOutputDto user) { IQueryable <PostOutputDto> postList = PostBll.LoadEntitiesNoTracking <PostOutputDto>(p => (p.Status == Status.Pended || user.IsAdmin)); //准备文章的查询 var notices = NoticeBll.LoadPageEntitiesFromL2CacheNoTracking <DateTime, NoticeOutputDto>(1, 5, out int _, n => (n.Status == Status.Display || user.IsAdmin), n => n.ModifyDate, false).ToList(); //加载前5条公告 var cats = await CategoryBll.LoadEntitiesFromL2CacheNoTrackingAsync <string, CategoryOutputDto>(c => c.Status == Status.Available, c => c.Name).ConfigureAwait(true); //加载分类目录 var comments = CommentBll.LoadPageEntitiesFromL2CacheNoTracking <DateTime, CommentOutputDto>(1, 10, out int _, c => c.Status == Status.Pended && c.Post.Status == Status.Pended || user.IsAdmin, c => c.CommentDate, false).ToList(); //加在新评论 var start = DateTime.Today.AddDays(-7); var hotSearches = await SearchDetailsBll.LoadEntitiesNoTracking(s => s.SearchTime > start, s => s.SearchTime, false).GroupBy(s => s.KeyWords.ToLower()).OrderByDescending(g => g.Count()).Take(10).Select(g => new KeywordsRankOutputDto() { KeyWords = g.FirstOrDefault().KeyWords, SearchCount = g.Count() }).ToListAsync(); //热词统计 var hot6Post = await(new Random().Next() % 2 == 0 ? postList.OrderByDescending(p => p.ViewCount) : postList.OrderByDescending(p => p.VoteUpCount)).Skip(0).Take(5).Cacheable().ToListAsync(); //热门文章 var topPostWeek = await PostBll.SqlQuery <SimplePostModel>("SELECT [Id],[Title] from Post WHERE Id in (SELECT top 10 PostId FROM [dbo].[PostAccessRecord] where DATEDIFF(week,AccessTime,getdate())<=1 GROUP BY PostId ORDER BY sum(ClickCount) desc)").ToListAsync(); //文章周排行 var topPostMonth = await PostBll.SqlQuery <SimplePostModel>("SELECT [Id],[Title] from Post WHERE Id in (SELECT top 10 PostId FROM [dbo].[PostAccessRecord] where DATEDIFF(month,AccessTime,getdate())<=1 GROUP BY PostId ORDER BY sum(ClickCount) desc)").ToListAsync(); //文章月排行 var topPostYear = await PostBll.SqlQuery <SimplePostModel>("SELECT [Id],[Title] from Post WHERE Id in (SELECT top 10 PostId FROM [dbo].[PostAccessRecord] where DATEDIFF(year,AccessTime,getdate())<=1 GROUP BY PostId ORDER BY sum(ClickCount) desc)").ToListAsync(); //文章年度排行 var tags = new List <string>(); //标签云 var tagdic = new Dictionary <string, int>(); var newdic = new Dictionary <string, int>(); //标签云最终结果 postList.Select(p => p.Label).ToList().ForEach(m => { if (!string.IsNullOrEmpty(m)) { tags.AddRange(m.Split(',', ',')); } });//统计标签 tags.GroupBy(s => s).ForEach(g => { tagdic.Add(g.Key, g.Count()); }); //将标签分组 if (tagdic.Any()) { int min = tagdic.Values.Min(); tagdic.ForEach(kv => { var fontsize = (int)Math.Floor(kv.Value * 1.0 / (min * 1.0) + 12.0); newdic.Add(kv.Key, fontsize >= 36 ? 36 : fontsize); }); } IList <PostOutputDto> posts; switch (orderBy)//文章排序 { case OrderBy.CommentCount: posts = postList.OrderByDescending(p => p.IsFixedTop).ThenByDescending(p => p.Comment.Count).Skip(size * (page - 1)).Take(size).ToList(); break; case OrderBy.PostDate: posts = postList.OrderByDescending(p => p.IsFixedTop).ThenByDescending(p => p.PostDate).Skip(size * (page - 1)).Take(size).ToList(); break; case OrderBy.ViewCount: posts = postList.OrderByDescending(p => p.IsFixedTop).ThenByDescending(p => p.ViewCount).Skip(size * (page - 1)).Take(size).ToList(); break; case OrderBy.VoteCount: posts = postList.OrderByDescending(p => p.IsFixedTop).ThenByDescending(p => p.VoteUpCount).Skip(size * (page - 1)).Take(size).ToList(); break; default: posts = postList.OrderByDescending(p => p.IsFixedTop).ThenByDescending(p => p.ModifyDate).Skip(size * (page - 1)).Take(size).ToList(); break; } return(new IndexPageViewModel() { Categories = cats.ToList(), Comments = comments, HotSearch = hotSearches, Notices = notices, Posts = posts, Tags = newdic, Top6Post = hot6Post, TopPostByMonth = topPostMonth, TopPostByWeek = topPostWeek, TopPostByYear = topPostYear, PostsQueryable = postList }); }