/// <summary>
        /// 根据帖吧搜索查询条件构建Lucene查询条件
        /// </summary>
        /// <param name="Query"></param>
        /// <returns></returns>
        private LuceneSearchBuilder BuildLuceneSearchBuilder(JournalFullTextQuery journalQuery)
        {
            LuceneSearchBuilder searchBuilder = new LuceneSearchBuilder();
            //范围
            Dictionary<string, BoostLevel> fieldNameAndBoosts = new Dictionary<string, BoostLevel>();

            //如果查的是相关日志
            if (journalQuery.IsRelationJournal)
            {
                fieldNameAndBoosts.Add(JournalIndexDocument.journalname, BoostLevel.Hight);
                fieldNameAndBoosts.Add(JournalIndexDocument.subcat, BoostLevel.Medium);
                fieldNameAndBoosts.Add(JournalIndexDocument.publisher, BoostLevel.Low);
                searchBuilder.WithPhrases(fieldNameAndBoosts, journalQuery.Keywords, BooleanClause.Occur.SHOULD, false);
                //searchBuilder.WithField(JournalIndexDocument.PrivacyStatus, ((int)PrivacyStatus.Public).ToString(), true, BoostLevel.Hight, true);
                searchBuilder.NotWithField(JournalIndexDocument.id.ToString(), journalQuery.CurrentThreadId.ToString());
            }
            else
            {
                switch (journalQuery.JournalRange)
                {
                    /*case JournalRange.MYBlOG:
                        searchBuilder.WithField(JournalIndexDocument.UserId, journalQuery.LoginId.ToString(), true, BoostLevel.Hight, false);
                        break;
                    case JournalRange.SOMEONEBLOG:
                        searchBuilder.WithField(JournalIndexDocument.UserId, journalQuery.UserId.ToString(), true, BoostLevel.Hight, false);
                        break;
                    case JournalRange.SITECATEGORY:
                        if (journalQuery.LoginId != 0)
                            searchBuilder.WithField(JournalIndexDocument.UserId, journalQuery.LoginId.ToString(), true, BoostLevel.Hight, false);
                        if (journalQuery.UserId != 0)
                            searchBuilder.WithField(JournalIndexDocument.UserId, journalQuery.UserId.ToString(), true, BoostLevel.Hight, false);
                        if (journalQuery.SiteCategoryId != 0)
                            searchBuilder.WithField(JournalIndexDocument.SiteCategoryId, journalQuery.SiteCategoryId.ToString(), true, BoostLevel.Hight, false);
                        break;**/
                    default:
                        break;
                }
                if (!string.IsNullOrEmpty(journalQuery.Keyword))
                {
                    switch (journalQuery.Range)
                    {
                        /*case JournalSearchRange.SUBJECT:
                            searchBuilder.WithPhrase(JournalIndexDocument.Subject, journalQuery.Keyword, BoostLevel.Hight, false);
                            break;
                        case JournalSearchRange.BODY:
                            searchBuilder.WithPhrase(JournalIndexDocument.Body, journalQuery.Keyword, BoostLevel.Hight, false);
                            break;
                        case JournalSearchRange.AUTHOR:
                            searchBuilder.WithPhrase(JournalIndexDocument.Author, journalQuery.Keyword, BoostLevel.Hight, false);
                            break;
                        case JournalSearchRange.TAG:
                            searchBuilder.WithPhrase(JournalIndexDocument.Tag, journalQuery.Keyword, BoostLevel.Hight, false);
                            break;
                        case JournalSearchRange.OWNERCATEGORYNAME:
                            searchBuilder.WithPhrase(JournalIndexDocument.OwnerCategoryName, journalQuery.Keyword, BoostLevel.Hight, false);
                            break;*/
                        default:
                            fieldNameAndBoosts.Add(JournalIndexDocument.journalname, BoostLevel.Hight);
                            fieldNameAndBoosts.Add(JournalIndexDocument.publisher, BoostLevel.Hight);
                            fieldNameAndBoosts.Add(JournalIndexDocument.subcat, BoostLevel.Medium);
                            fieldNameAndBoosts.Add(JournalIndexDocument.jdescrip, BoostLevel.Medium);
                            fieldNameAndBoosts.Add(JournalIndexDocument.abbr, BoostLevel.Medium);
                            //fieldNameAndBoosts.Add(JournalIndexDocument.OwnerCategoryName, BoostLevel.Medium);
                            //fieldNameAndBoosts.Add(JournalIndexDocument.Author, BoostLevel.Low);
                            searchBuilder.WithPhrases(fieldNameAndBoosts, journalQuery.Keyword, BooleanClause.Occur.SHOULD, false);
                            break;
                    }
                }

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

                if (!(UserContext.CurrentUser != null && UserContext.CurrentUser.UserId == journalQuery.LoginId && journalQuery.AllId != 0))
                {
                    searchBuilder.NotWithField(JournalIndexDocument.PrivacyStatus, ((int)PrivacyStatus.Private).ToString());
                }*/
            }

            //筛选
            //全部、某人的日志
            /*if (journalQuery.AllId != 0)
            {
                if (journalQuery.LoginId != 0)
                {
                    searchBuilder.WithField(JournalIndexDocument.UserId, journalQuery.LoginId.ToString(), true, BoostLevel.Hight, true);
                }
                else if (journalQuery.UserId != 0)
                {
                    searchBuilder.WithField(JournalIndexDocument.UserId, journalQuery.UserId.ToString(), true, BoostLevel.Hight, true);
                }
            }
            */
            //过滤可以显示的日志
            /*switch (publiclyAuditStatus)
            {
                case PubliclyAuditStatus.Again:
                case PubliclyAuditStatus.Fail:
                case PubliclyAuditStatus.Pending:
                case PubliclyAuditStatus.Success:
                    searchBuilder.WithField(JournalIndexDocument.AuditStatus, ((int)publiclyAuditStatus).ToString(), true, BoostLevel.Hight, true);
                    break;
                case PubliclyAuditStatus.Again_GreaterThanOrEqual:
                case PubliclyAuditStatus.Pending_GreaterThanOrEqual:
                    searchBuilder.WithinRange(JournalIndexDocument.AuditStatus, ((int)publiclyAuditStatus).ToString(), ((int)PubliclyAuditStatus.Success).ToString(), true);
                    break;
            }*/

            return searchBuilder;
        }
        /// <summary>
        /// 根据帖吧搜索查询条件构建Lucene查询条件
        /// </summary>
        /// <param name="Query"></param>
        /// <returns></returns>
        private LuceneSearchBuilder BuildLuceneSearchBuilder(JournalFullTextQuery journalQuery)
        {
            LuceneSearchBuilder searchBuilder = new LuceneSearchBuilder();
            //范围
            Dictionary <string, BoostLevel> fieldNameAndBoosts = new Dictionary <string, BoostLevel>();

            //如果查的是相关日志
            if (journalQuery.IsRelationJournal)
            {
                fieldNameAndBoosts.Add(JournalIndexDocument.journalname, BoostLevel.Hight);
                fieldNameAndBoosts.Add(JournalIndexDocument.subcat, BoostLevel.Medium);
                fieldNameAndBoosts.Add(JournalIndexDocument.publisher, BoostLevel.Low);
                searchBuilder.WithPhrases(fieldNameAndBoosts, journalQuery.Keywords, BooleanClause.Occur.SHOULD, false);
                //searchBuilder.WithField(JournalIndexDocument.PrivacyStatus, ((int)PrivacyStatus.Public).ToString(), true, BoostLevel.Hight, true);
                searchBuilder.NotWithField(JournalIndexDocument.id.ToString(), journalQuery.CurrentThreadId.ToString());
            }
            else
            {
                switch (journalQuery.JournalRange)
                {
                /*case JournalRange.MYBlOG:
                 *  searchBuilder.WithField(JournalIndexDocument.UserId, journalQuery.LoginId.ToString(), true, BoostLevel.Hight, false);
                 *  break;
                 * case JournalRange.SOMEONEBLOG:
                 *  searchBuilder.WithField(JournalIndexDocument.UserId, journalQuery.UserId.ToString(), true, BoostLevel.Hight, false);
                 *  break;
                 * case JournalRange.SITECATEGORY:
                 *  if (journalQuery.LoginId != 0)
                 *      searchBuilder.WithField(JournalIndexDocument.UserId, journalQuery.LoginId.ToString(), true, BoostLevel.Hight, false);
                 *  if (journalQuery.UserId != 0)
                 *      searchBuilder.WithField(JournalIndexDocument.UserId, journalQuery.UserId.ToString(), true, BoostLevel.Hight, false);
                 *  if (journalQuery.SiteCategoryId != 0)
                 *      searchBuilder.WithField(JournalIndexDocument.SiteCategoryId, journalQuery.SiteCategoryId.ToString(), true, BoostLevel.Hight, false);
                 *  break;**/
                default:
                    break;
                }
                if (!string.IsNullOrEmpty(journalQuery.Keyword))
                {
                    switch (journalQuery.Range)
                    {
                    /*case JournalSearchRange.SUBJECT:
                     *  searchBuilder.WithPhrase(JournalIndexDocument.Subject, journalQuery.Keyword, BoostLevel.Hight, false);
                     *  break;
                     * case JournalSearchRange.BODY:
                     *  searchBuilder.WithPhrase(JournalIndexDocument.Body, journalQuery.Keyword, BoostLevel.Hight, false);
                     *  break;
                     * case JournalSearchRange.AUTHOR:
                     *  searchBuilder.WithPhrase(JournalIndexDocument.Author, journalQuery.Keyword, BoostLevel.Hight, false);
                     *  break;
                     * case JournalSearchRange.TAG:
                     *  searchBuilder.WithPhrase(JournalIndexDocument.Tag, journalQuery.Keyword, BoostLevel.Hight, false);
                     *  break;
                     * case JournalSearchRange.OWNERCATEGORYNAME:
                     *  searchBuilder.WithPhrase(JournalIndexDocument.OwnerCategoryName, journalQuery.Keyword, BoostLevel.Hight, false);
                     *  break;*/
                    default:
                        fieldNameAndBoosts.Add(JournalIndexDocument.journalname, BoostLevel.Hight);
                        fieldNameAndBoosts.Add(JournalIndexDocument.publisher, BoostLevel.Hight);
                        fieldNameAndBoosts.Add(JournalIndexDocument.subcat, BoostLevel.Medium);
                        fieldNameAndBoosts.Add(JournalIndexDocument.jdescrip, BoostLevel.Medium);
                        fieldNameAndBoosts.Add(JournalIndexDocument.abbr, BoostLevel.Medium);
                        //fieldNameAndBoosts.Add(JournalIndexDocument.OwnerCategoryName, BoostLevel.Medium);
                        //fieldNameAndBoosts.Add(JournalIndexDocument.Author, BoostLevel.Low);
                        searchBuilder.WithPhrases(fieldNameAndBoosts, journalQuery.Keyword, BooleanClause.Occur.SHOULD, false);
                        break;
                    }
                }

                //某个站点分类

                /*if (journalQuery.SiteCategoryId != 0)
                 * {
                 *  searchBuilder.WithField(JournalIndexDocument.SiteCategoryId, journalQuery.SiteCategoryId.ToString(), true, BoostLevel.Hight, true);
                 * }
                 *
                 * if (!(UserContext.CurrentUser != null && UserContext.CurrentUser.UserId == journalQuery.LoginId && journalQuery.AllId != 0))
                 * {
                 *  searchBuilder.NotWithField(JournalIndexDocument.PrivacyStatus, ((int)PrivacyStatus.Private).ToString());
                 * }*/
            }

            //筛选
            //全部、某人的日志

            /*if (journalQuery.AllId != 0)
             * {
             *  if (journalQuery.LoginId != 0)
             *  {
             *      searchBuilder.WithField(JournalIndexDocument.UserId, journalQuery.LoginId.ToString(), true, BoostLevel.Hight, true);
             *  }
             *  else if (journalQuery.UserId != 0)
             *  {
             *      searchBuilder.WithField(JournalIndexDocument.UserId, journalQuery.UserId.ToString(), true, BoostLevel.Hight, true);
             *  }
             * }
             */
            //过滤可以显示的日志

            /*switch (publiclyAuditStatus)
             * {
             *  case PubliclyAuditStatus.Again:
             *  case PubliclyAuditStatus.Fail:
             *  case PubliclyAuditStatus.Pending:
             *  case PubliclyAuditStatus.Success:
             *      searchBuilder.WithField(JournalIndexDocument.AuditStatus, ((int)publiclyAuditStatus).ToString(), true, BoostLevel.Hight, true);
             *      break;
             *  case PubliclyAuditStatus.Again_GreaterThanOrEqual:
             *  case PubliclyAuditStatus.Pending_GreaterThanOrEqual:
             *      searchBuilder.WithinRange(JournalIndexDocument.AuditStatus, ((int)publiclyAuditStatus).ToString(), ((int)PubliclyAuditStatus.Success).ToString(), true);
             *      break;
             * }*/

            return(searchBuilder);
        }
        /// <summary>
        /// 日志分页搜索
        /// </summary>
        /// <param name="journalQuery">搜索条件</param>
        /// <returns>符合搜索条件的分页集合</returns>
        public PagingDataSet<Journal> Search(JournalFullTextQuery journalQuery)
        {
            if (journalQuery.SiteCategoryId == 0 && journalQuery.LoginId == 0 && journalQuery.UserId == 0)
            {
                if (string.IsNullOrWhiteSpace(journalQuery.Keyword) && journalQuery.IsRelationJournal == false)
                {
                    return new PagingDataSet<Journal>(new List<Journal>());
                }
            }

            LuceneSearchBuilder searchBuilder = BuildLuceneSearchBuilder(journalQuery);

            //使用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, journalQuery.PageIndex, journalQuery.PageSize);
            IEnumerable<Document> docs = searchResult.ToList<Document>();

            //解析出搜索结果中的日志ID
            List<long> journalIds = new List<long>();
            //获取索引中日志的标签
            Dictionary<long, IEnumerable<string>> journalTags = new Dictionary<long, IEnumerable<string>>();
            //获取索引中日志的用户分类名
            Dictionary<long, IEnumerable<string>> journalOwnerCategoryNames = new Dictionary<long, IEnumerable<string>>();

            foreach (Document doc in docs)
            {
                long journalid = long.Parse(doc.Get(JournalIndexDocument.id));
                journalIds.Add(journalid);
                //journalTags[journalid] = doc.GetValues(JournalIndexDocument.Tag).ToList<string>();
                //journalOwnerCategoryNames[journalid] = doc.GetValues(JournalIndexDocument.OwnerCategoryName).ToList<string>();
            }

            //根据日志ID列表批量查询日志实例
            IEnumerable<Journal> journalList = journalService.GetJournalsByIds(journalIds);

            /*foreach (var journal in journalList)
            {
                journal.Body = journal.GetBody();
                if (blogTags.ContainsKey(journal.ThreadId))
                {
                    journal.TagNames = blogTags[journal.ThreadId];
                }
                if (journalOwnerCategoryNames.ContainsKey(journal.ThreadId))
                {
                    journal.OwnerCategoryNames = journalOwnerCategoryNames[journal.ThreadId];
                }
            }
            */
            //组装分页对象
            PagingDataSet<Journal> journals = new PagingDataSet<Journal>(journalList)
            {
                TotalRecords = searchResult.TotalRecords,
                PageSize = searchResult.PageSize,
                PageIndex = searchResult.PageIndex,
                QueryDuration = searchResult.QueryDuration
            };

            return journals;
        }
        /// <summary>
        /// 日志分页搜索
        /// </summary>
        /// <param name="journalQuery">搜索条件</param>
        /// <returns>符合搜索条件的分页集合</returns>
        public PagingDataSet <Journal> Search(JournalFullTextQuery journalQuery)
        {
            if (journalQuery.SiteCategoryId == 0 && journalQuery.LoginId == 0 && journalQuery.UserId == 0)
            {
                if (string.IsNullOrWhiteSpace(journalQuery.Keyword) && journalQuery.IsRelationJournal == false)
                {
                    return(new PagingDataSet <Journal>(new List <Journal>()));
                }
            }

            LuceneSearchBuilder searchBuilder = BuildLuceneSearchBuilder(journalQuery);

            //使用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, journalQuery.PageIndex, journalQuery.PageSize);
            IEnumerable <Document>   docs         = searchResult.ToList <Document>();

            //解析出搜索结果中的日志ID
            List <long> journalIds = new List <long>();
            //获取索引中日志的标签
            Dictionary <long, IEnumerable <string> > journalTags = new Dictionary <long, IEnumerable <string> >();
            //获取索引中日志的用户分类名
            Dictionary <long, IEnumerable <string> > journalOwnerCategoryNames = new Dictionary <long, IEnumerable <string> >();

            foreach (Document doc in docs)
            {
                long journalid = long.Parse(doc.Get(JournalIndexDocument.id));
                journalIds.Add(journalid);
                //journalTags[journalid] = doc.GetValues(JournalIndexDocument.Tag).ToList<string>();
                //journalOwnerCategoryNames[journalid] = doc.GetValues(JournalIndexDocument.OwnerCategoryName).ToList<string>();
            }

            //根据日志ID列表批量查询日志实例
            IEnumerable <Journal> journalList = journalService.GetJournalsByIds(journalIds);

            /*foreach (var journal in journalList)
             * {
             *  journal.Body = journal.GetBody();
             *  if (blogTags.ContainsKey(journal.ThreadId))
             *  {
             *      journal.TagNames = blogTags[journal.ThreadId];
             *  }
             *  if (journalOwnerCategoryNames.ContainsKey(journal.ThreadId))
             *  {
             *      journal.OwnerCategoryNames = journalOwnerCategoryNames[journal.ThreadId];
             *  }
             * }
             */
            //组装分页对象
            PagingDataSet <Journal> journals = new PagingDataSet <Journal>(journalList)
            {
                TotalRecords  = searchResult.TotalRecords,
                PageSize      = searchResult.PageSize,
                PageIndex     = searchResult.PageIndex,
                QueryDuration = searchResult.QueryDuration
            };

            return(journals);
        }