Esempio n. 1
0
        /// <summary>
        /// 根据帖吧搜索查询条件构建Lucene查询条件
        /// </summary>
        /// <param name="Query">搜索条件</param>
        /// <param name="interestTopic">是否是查询可能感兴趣的专题</param>
        /// <returns></returns>
        private LuceneSearchBuilder BuildLuceneSearchBuilder(TopicFullTextQuery groupQuery, bool interestTopic = false)
        {
            LuceneSearchBuilder             searchBuilder      = new LuceneSearchBuilder();
            Dictionary <string, BoostLevel> fieldNameAndBoosts = new Dictionary <string, BoostLevel>();

            //关键字为空就是在搜地区时关键字为空
            if (groupQuery.KeywordIsNull)
            {
                if (!string.IsNullOrEmpty(groupQuery.NowAreaCode))
                {
                    searchBuilder.WithField(TopicIndexDocument.AreaCode, groupQuery.NowAreaCode.TrimEnd('0'), false, BoostLevel.Hight, false);
                }
                else
                {
                    searchBuilder.WithFields(TopicIndexDocument.AreaCode, new string[] { "1", "2", "3" }, false, BoostLevel.Hight, false);
                }
            }

            if (!string.IsNullOrEmpty(groupQuery.Keyword))
            {
                //范围
                switch (groupQuery.Range)
                {
                case TopicSearchRange.TOPICNAME:
                    searchBuilder.WithPhrase(TopicIndexDocument.TopicName, groupQuery.Keyword, BoostLevel.Hight, false);
                    break;

                case TopicSearchRange.DESCRIPTION:
                    searchBuilder.WithPhrase(TopicIndexDocument.Description, groupQuery.Keyword, BoostLevel.Hight, false);
                    break;

                case TopicSearchRange.TAG:
                    searchBuilder.WithPhrase(TopicIndexDocument.Tag, groupQuery.Keyword, BoostLevel.Hight, false);
                    break;

                case TopicSearchRange.CATEGORYNAME:
                    searchBuilder.WithPhrase(TopicIndexDocument.CategoryName, groupQuery.Keyword, BoostLevel.Hight, false);
                    break;

                default:
                    fieldNameAndBoosts.Add(TopicIndexDocument.TopicName, BoostLevel.Hight);
                    fieldNameAndBoosts.Add(TopicIndexDocument.Description, BoostLevel.Medium);
                    fieldNameAndBoosts.Add(TopicIndexDocument.Tag, BoostLevel.Medium);
                    fieldNameAndBoosts.Add(TopicIndexDocument.CategoryName, BoostLevel.Medium);
                    searchBuilder.WithPhrases(fieldNameAndBoosts, groupQuery.Keyword, BooleanClause.Occur.SHOULD, false);
                    break;
                }
            }

            //根据标签搜索可能感兴趣的专题
            if (interestTopic)
            {
                searchBuilder.WithPhrases(TopicIndexDocument.Tag, groupQuery.Tags, BoostLevel.Hight, false);
                searchBuilder.NotWithFields(TopicIndexDocument.TopicId, groupQuery.TopicIds);
            }

            //筛选
            //某地区
            if (!string.IsNullOrEmpty(groupQuery.NowAreaCode))
            {
                searchBuilder.WithField(TopicIndexDocument.AreaCode, groupQuery.NowAreaCode.TrimEnd('0'), false, BoostLevel.Hight, true);
            }

            //某分类
            if (groupQuery.CategoryId != 0)
            {
                //fixed by wanf:发现专题已经不再用全文检索了

                CategoryService        categoryService = new CategoryService();
                IEnumerable <Category> categories      = categoryService.GetDescendants(groupQuery.CategoryId);
                List <string>          categoryIds     = new List <string> {
                    groupQuery.CategoryId.ToString()
                };
                if (categories != null && categories.Count() > 0)
                {
                    categoryIds.AddRange(categories.Select(n => n.CategoryId.ToString()));
                }

                searchBuilder.WithFields(TopicIndexDocument.CategoryId, categoryIds, true, BoostLevel.Hight, true);
            }

            //公开的专题
            searchBuilder.WithField(TopicIndexDocument.IsPublic, "1", true, BoostLevel.Hight, true);

            //过滤可以显示的专题
            switch (publiclyAuditStatus)
            {
            case PubliclyAuditStatus.Again:
            case PubliclyAuditStatus.Fail:
            case PubliclyAuditStatus.Pending:
            case PubliclyAuditStatus.Success:
                searchBuilder.WithField(TopicIndexDocument.AuditStatus, ((int)publiclyAuditStatus).ToString(), true, BoostLevel.Hight, true);
                break;

            case PubliclyAuditStatus.Again_GreaterThanOrEqual:
            case PubliclyAuditStatus.Pending_GreaterThanOrEqual:
                searchBuilder.WithinRange(TopicIndexDocument.AuditStatus, ((int)publiclyAuditStatus).ToString(), ((int)PubliclyAuditStatus.Success).ToString(), true);
                break;
            }

            if (groupQuery.sortBy.HasValue)
            {
                switch (groupQuery.sortBy.Value)
                {
                case SortBy_Topic.DateCreated_Desc:
                    searchBuilder.SortByString(TopicIndexDocument.DateCreated, true);
                    break;

                case SortBy_Topic.MemberCount_Desc:
                    searchBuilder.SortByString(TopicIndexDocument.MemberCount, true);
                    break;

                case SortBy_Topic.GrowthValue_Desc:
                    searchBuilder.SortByString(TopicIndexDocument.GrowthValue, true);
                    break;
                }
            }
            else
            {
                //时间倒序排序
                searchBuilder.SortByString(TopicIndexDocument.DateCreated, true);
            }

            return(searchBuilder);
        }