/// <summary> /// 根据帖吧搜索查询条件构建Lucene查询条件 /// </summary> /// <param name="Query">搜索条件</param> /// <param name="interestGroup">是否是查询可能感兴趣的群组</param> /// <returns></returns> private LuceneSearchBuilder BuildLuceneSearchBuilder(GroupFullTextQuery groupQuery, bool interestGroup = false) { LuceneSearchBuilder searchBuilder = new LuceneSearchBuilder(); Dictionary<string, BoostLevel> fieldNameAndBoosts = new Dictionary<string, BoostLevel>(); //关键字为空就是在搜地区时关键字为空 if (groupQuery.KeywordIsNull) { if (!string.IsNullOrEmpty(groupQuery.NowAreaCode)) searchBuilder.WithField(GroupIndexDocument.AreaCode, groupQuery.NowAreaCode.TrimEnd('0'), false, BoostLevel.Hight, false); else searchBuilder.WithFields(GroupIndexDocument.AreaCode, new string[] { "1", "2", "3" }, false, BoostLevel.Hight, false); } if (!string.IsNullOrEmpty(groupQuery.Keyword)) { //范围 switch (groupQuery.Range) { case GroupSearchRange.GROUPNAME: searchBuilder.WithPhrase(GroupIndexDocument.GroupName, groupQuery.Keyword, BoostLevel.Hight, false); break; case GroupSearchRange.DESCRIPTION: searchBuilder.WithPhrase(GroupIndexDocument.Description, groupQuery.Keyword, BoostLevel.Hight, false); break; case GroupSearchRange.TAG: searchBuilder.WithPhrase(GroupIndexDocument.Tag, groupQuery.Keyword, BoostLevel.Hight, false); break; case GroupSearchRange.CATEGORYNAME: searchBuilder.WithPhrase(GroupIndexDocument.CategoryName, groupQuery.Keyword, BoostLevel.Hight, false); break; default: fieldNameAndBoosts.Add(GroupIndexDocument.GroupName, BoostLevel.Hight); fieldNameAndBoosts.Add(GroupIndexDocument.Description, BoostLevel.Medium); fieldNameAndBoosts.Add(GroupIndexDocument.Tag, BoostLevel.Medium); fieldNameAndBoosts.Add(GroupIndexDocument.CategoryName, BoostLevel.Medium); searchBuilder.WithPhrases(fieldNameAndBoosts, groupQuery.Keyword, BooleanClause.Occur.SHOULD, false); break; } } //根据标签搜索可能感兴趣的群组 if (interestGroup) { searchBuilder.WithPhrases(GroupIndexDocument.Tag, groupQuery.Tags, BoostLevel.Hight, false); searchBuilder.NotWithFields(GroupIndexDocument.GroupId, groupQuery.GroupIds); } //筛选 //某地区 if (!string.IsNullOrEmpty(groupQuery.NowAreaCode)) { searchBuilder.WithField(GroupIndexDocument.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(GroupIndexDocument.CategoryId, categoryIds, true, BoostLevel.Hight, true); } //公开的群组 searchBuilder.WithField(GroupIndexDocument.IsPublic, "1", true, BoostLevel.Hight, true); //过滤可以显示的群组 switch (publiclyAuditStatus) { case PubliclyAuditStatus.Again: case PubliclyAuditStatus.Fail: case PubliclyAuditStatus.Pending: case PubliclyAuditStatus.Success: searchBuilder.WithField(GroupIndexDocument.AuditStatus, ((int)publiclyAuditStatus).ToString(), true, BoostLevel.Hight, true); break; case PubliclyAuditStatus.Again_GreaterThanOrEqual: case PubliclyAuditStatus.Pending_GreaterThanOrEqual: searchBuilder.WithinRange(GroupIndexDocument.AuditStatus, ((int)publiclyAuditStatus).ToString(), ((int)PubliclyAuditStatus.Success).ToString(), true); break; } if (groupQuery.sortBy.HasValue) { switch (groupQuery.sortBy.Value) { case SortBy_Group.DateCreated_Desc: searchBuilder.SortByString(GroupIndexDocument.DateCreated, true); break; case SortBy_Group.MemberCount_Desc: searchBuilder.SortByString(GroupIndexDocument.MemberCount, true); break; case SortBy_Group.GrowthValue_Desc: searchBuilder.SortByString(GroupIndexDocument.GrowthValue, true); break; } } else { //时间倒序排序 searchBuilder.SortByString(GroupIndexDocument.DateCreated, true); } return searchBuilder; }