/// <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); }