コード例 #1
0
ファイル: WikiSearcher.cs プロジェクト: x1987624/SNS
        /// <summary>
        /// 日志分页搜索
        /// </summary>
        /// <param name="WikiQuery">搜索条件</param>
        /// <returns>符合搜索条件的分页集合</returns>
        public PagingDataSet <WikiPage> Search(WikiFullTextQuery WikiQuery)
        {
            if (WikiQuery.SiteCategoryId == 0)
            {
                if (string.IsNullOrWhiteSpace(WikiQuery.Keyword))
                {
                    return(new PagingDataSet <WikiPage>(new List <WikiPage>()));
                }
            }

            LuceneSearchBuilder searchBuilder = BuildLuceneSearchBuilder(WikiQuery);

            //使用LuceneSearchBuilder构建Lucene需要Query、Filter、Sort
            Query  query  = null;
            Filter filter = null;
            Sort   sort   = null;

            searchBuilder.BuildQuery(out query, out filter, out sort);

            //调用SearchService.Search(),执行搜索
            PagingDataSet <Document> searchResult = searchEngine.Search(query, filter, sort, WikiQuery.PageIndex, WikiQuery.PageSize);
            IEnumerable <Document>   docs         = searchResult.ToList <Document>();

            //解析出搜索结果中的日志ID
            List <long> WikiPageIds = new List <long>();
            //获取索引中百科的标签
            Dictionary <long, IEnumerable <string> > WikiTags = new Dictionary <long, IEnumerable <string> >();

            foreach (Document doc in docs)
            {
                long WikiPageId = long.Parse(doc.Get(WikiIndexDocument.PageId));
                WikiPageIds.Add(WikiPageId);
                WikiTags[WikiPageId] = doc.GetValues(WikiIndexDocument.Tag).ToList <string>();
            }

            //根据日志ID列表批量查询日志实例
            IEnumerable <WikiPage> WikiPageList = wikiService.GetWikiPages(WikiPageIds);

            foreach (var WikiPage in WikiPageList)
            {
                if (WikiTags.ContainsKey(WikiPage.PageId))
                {
                    WikiPage.TagNames = WikiTags[WikiPage.PageId];
                }
            }

            //组装分页对象
            PagingDataSet <WikiPage> WikiPages = new PagingDataSet <WikiPage>(WikiPageList)
            {
                TotalRecords  = searchResult.TotalRecords,
                PageSize      = searchResult.PageSize,
                PageIndex     = searchResult.PageIndex,
                QueryDuration = searchResult.QueryDuration
            };

            return(WikiPages);
        }
コード例 #2
0
ファイル: WikiSearcher.cs プロジェクト: x1987624/SNS
        /// <summary>
        /// 根据帖吧搜索查询条件构建Lucene查询条件
        /// </summary>
        /// <param name="Query"></param>
        /// <returns></returns>
        private LuceneSearchBuilder BuildLuceneSearchBuilder(WikiFullTextQuery WikiQuery)
        {
            LuceneSearchBuilder searchBuilder = new LuceneSearchBuilder();
            //范围
            Dictionary <string, BoostLevel> fieldNameAndBoosts = new Dictionary <string, BoostLevel>();

            if (!string.IsNullOrEmpty(WikiQuery.Keyword))
            {
                switch (WikiQuery.Range)
                {
                case WikiSearchRange.Title:
                    searchBuilder.WithPhrase(WikiIndexDocument.Title, WikiQuery.Keyword, BoostLevel.Hight, false);
                    break;

                case WikiSearchRange.Category:
                    searchBuilder.WithPhrase(WikiIndexDocument.CategoryId, WikiQuery.Keyword, BoostLevel.Hight, false);
                    break;

                case WikiSearchRange.AUTHOR:
                    searchBuilder.WithPhrase(WikiIndexDocument.Author, WikiQuery.Keyword, BoostLevel.Hight, false);
                    break;

                case WikiSearchRange.TAG:
                    searchBuilder.WithPhrase(WikiIndexDocument.Tag, WikiQuery.Keyword, BoostLevel.Hight, false);
                    break;

                default:
                    fieldNameAndBoosts.Add(WikiIndexDocument.Title, BoostLevel.Hight);
                    fieldNameAndBoosts.Add(WikiIndexDocument.Tag, BoostLevel.Medium);
                    fieldNameAndBoosts.Add(WikiIndexDocument.Body, BoostLevel.Medium);
                    fieldNameAndBoosts.Add(WikiIndexDocument.Author, BoostLevel.Low);
                    fieldNameAndBoosts.Add(WikiIndexDocument.CategoryId, BoostLevel.Hight);
                    searchBuilder.WithPhrases(fieldNameAndBoosts, WikiQuery.Keyword, BooleanClause.Occur.SHOULD, false);
                    break;
                }
            }

            //某个站点分类
            if (WikiQuery.SiteCategoryId != 0)
            {
                searchBuilder.WithField(WikiIndexDocument.CategoryId, WikiQuery.SiteCategoryId.ToString(), true, BoostLevel.Hight, true);
            }

            return(searchBuilder);
        }