Пример #1
0
        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);
        }
Пример #2
0
        /// <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
            });
        }