Browse Source

搜索统计优化

懒得勤快 5 years ago
parent
commit
a3fc5ca3ed

+ 3 - 20
src/Masuit.MyBlogs.Core/Extensions/Hangfire/HangfireBackJob.cs

@@ -235,26 +235,9 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
         /// </summary>
         public void StatisticsSearchKeywords()
         {
-            var start = DateTime.Today.AddMonths(-1);
-            var temp = _searchDetailsService.GetQueryNoTracking(s => s.SearchTime > start, s => s.SearchTime, false).ToList();
-            var month = temp.GroupBy(s => s.IP + s.KeyWords.ToLower()).OrderByDescending(g => g.Count()).Take(30).Select(g => new
-            {
-                Keywords = g.FirstOrDefault().KeyWords,
-                Count = g.Count()
-            }).ToList();
-            var week = temp.Where(s => s.SearchTime > DateTime.Today.AddDays(-7)).GroupBy(s => s.IP + s.KeyWords.ToLower()).OrderByDescending(g => g.Count()).Take(30).Select(g => new
-            {
-                Keywords = g.FirstOrDefault().KeyWords,
-                Count = g.Count()
-            }).ToList();
-            var today = temp.Where(s => s.SearchTime > DateTime.Today).GroupBy(s => s.KeyWords.ToLower()).OrderByDescending(g => g.Count()).Take(30).Select(g => new
-            {
-                Keywords = g.FirstOrDefault().KeyWords,
-                Count = g.Count()
-            }).ToList();
-            RedisHelper.Set("SearchRank:Month", month);
-            RedisHelper.Set("SearchRank:Week", week);
-            RedisHelper.Set("SearchRank:Today", today);
+            RedisHelper.Set("SearchRank:Month", _searchDetailsService.GetRanks(DateTime.Today.AddMonths(-1)));
+            RedisHelper.Set("SearchRank:Week", _searchDetailsService.GetRanks(DateTime.Today.AddDays(-7)));
+            RedisHelper.Set("SearchRank:Today", _searchDetailsService.GetRanks(DateTime.Today));
         }
     }
 }

+ 2 - 0
src/Masuit.MyBlogs.Core/Infrastructure/DataContext.cs

@@ -46,6 +46,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure
             });
             modelBuilder.Entity<SeminarPostHistoryVersion>().Property(s => s.SeminarId).HasColumnName("Seminar_Id");
             modelBuilder.Entity<SeminarPostHistoryVersion>().Property(s => s.PostHistoryVersionId).HasColumnName("PostHistoryVersion_Id");
+            modelBuilder.Entity<SearchRank>().HasNoKey().HasNoDiscriminator();
         }
 
         public override int SaveChanges()
@@ -80,6 +81,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure
 
         public virtual DbSet<PostMergeRequest> PostMergeRequests { get; set; }
         public virtual DbSet<Advertisement> Advertisements { get; set; }
+        public virtual DbSet<SearchRank> SearchRanks { get; set; }
     }
 
     /// <summary>

+ 11 - 1
src/Masuit.MyBlogs.Core/Infrastructure/Repository/Interface/ISearchDetailsRepository.cs

@@ -1,6 +1,16 @@
 using Masuit.MyBlogs.Core.Models.Entity;
+using System;
+using System.Collections.Generic;
 
 namespace Masuit.MyBlogs.Core.Infrastructure.Repository.Interface
 {
-    public partial interface ISearchDetailsRepository : IBaseRepository<SearchDetails> { }
+    public partial interface ISearchDetailsRepository : IBaseRepository<SearchDetails>
+    {
+        /// <summary>
+        /// 搜索统计
+        /// </summary>
+        /// <param name="start"></param>
+        /// <returns></returns>
+        List<SearchRank> GetRanks(DateTime start);
+    }
 }

+ 9 - 0
src/Masuit.MyBlogs.Core/Infrastructure/Repository/SearchDetailsRepository.cs

@@ -1,5 +1,9 @@
 using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
 using Masuit.MyBlogs.Core.Models.Entity;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
 
 namespace Masuit.MyBlogs.Core.Infrastructure.Repository
 {
@@ -15,5 +19,10 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Repository
             DataContext.Add(t);
             return t;
         }
+
+        public List<SearchRank> GetRanks(DateTime start)
+        {
+            return DataContext.SearchRanks.FromSqlRaw($"SELECT KeyWords Keywords,COUNT(*) Count from (SELECT IP,KeyWords FROM `searchdetails` WHERE SearchTime>'{start:yyyy-MM-dd}' GROUP BY IP,KeyWords) as t GROUP BY KeyWords ORDER BY COUNT(1) DESC LIMIT 30").ToList();
+        }
     }
 }

+ 4 - 4
src/Masuit.MyBlogs.Core/Infrastructure/Services/BaseService.cs

@@ -17,14 +17,14 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
     public class BaseService<T> : IBaseService<T> where T : class, new()
     {
         public virtual IBaseRepository<T> BaseDal { get; set; }
-        protected readonly ISearchEngine<DataContext> _searchEngine;
-        protected readonly ILuceneIndexSearcher _searcher;
+        protected readonly ISearchEngine<DataContext> SearchEngine;
+        protected readonly ILuceneIndexSearcher Searcher;
 
         public BaseService(IBaseRepository<T> repository, ISearchEngine<DataContext> searchEngine, ILuceneIndexSearcher searcher)
         {
             BaseDal = repository;
-            _searchEngine = searchEngine;
-            _searcher = searcher;
+            SearchEngine = searchEngine;
+            Searcher = searcher;
         }
 
         /// <summary>

+ 12 - 1
src/Masuit.MyBlogs.Core/Infrastructure/Services/Interface/ISearchDetailsService.cs

@@ -1,6 +1,17 @@
 using Masuit.MyBlogs.Core.Models.Entity;
+using System;
+using System.Collections.Generic;
 
 namespace Masuit.MyBlogs.Core.Infrastructure.Services.Interface
 {
-    public partial interface ISearchDetailsService : IBaseService<SearchDetails> { }
+    public partial interface ISearchDetailsService : IBaseService<SearchDetails>
+    {
+
+        /// <summary>
+        /// 搜索统计
+        /// </summary>
+        /// <param name="start"></param>
+        /// <returns></returns>
+        List<SearchRank> GetRanks(DateTime start);
+    }
 }

+ 14 - 14
src/Masuit.MyBlogs.Core/Infrastructure/Services/PostService.cs

@@ -37,7 +37,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
                 return _cacheManager.Get(cacheKey);
             }
 
-            var searchResult = _searchEngine.ScoredSearch<Post>(BuildSearchOptions(page, size, keyword));
+            var searchResult = SearchEngine.ScoredSearch<Post>(BuildSearchOptions(page, size, keyword));
             var entities = searchResult.Results.Where(s => s.Entity.Status == Status.Pended).ToList();
             var ids = entities.Select(s => s.Entity.Id).ToArray();
             var dic = GetQuery<PostDto>(p => ids.Contains(p.Id)).ToDictionary(p => p.Id);
@@ -57,7 +57,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
             }).ToList();
             var simpleHtmlFormatter = new SimpleHTMLFormatter("<span style='color:red;background-color:yellow;font-size: 1.1em;font-weight:700;'>", "</span>");
             var highlighter = new Highlighter(simpleHtmlFormatter, new Segment()) { FragmentSize = 200 };
-            var keywords = _searcher.CutKeywords(keyword);
+            var keywords = Searcher.CutKeywords(keyword);
             HighlightSegment(posts, keywords, highlighter);
 
             var result = new SearchResult<PostDto>()
@@ -140,7 +140,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         public override Post AddEntitySaved(Post t)
         {
             t = base.AddEntity(t);
-            _searchEngine.SaveChanges(t.Status == Status.Pended);
+            SearchEngine.SaveChanges(t.Status == Status.Pended);
             return t;
         }
 
@@ -152,7 +152,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         public override Task<int> AddEntitySavedAsync(Post t)
         {
             base.AddEntity(t);
-            return _searchEngine.SaveChangesAsync(t.Status == Status.Pended);
+            return SearchEngine.SaveChangesAsync(t.Status == Status.Pended);
         }
 
         /// <summary>
@@ -163,7 +163,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         public override bool DeleteByIdSaved(object id)
         {
             base.DeleteById(id);
-            return _searchEngine.SaveChanges() > 0;
+            return SearchEngine.SaveChanges() > 0;
         }
 
         /// <summary>
@@ -174,7 +174,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         public override bool DeleteEntitiesSaved(IEnumerable<Post> list)
         {
             base.DeleteEntities(list);
-            return _searchEngine.SaveChanges() > 0;
+            return SearchEngine.SaveChanges() > 0;
         }
 
         /// <summary>
@@ -185,7 +185,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         public override Task<int> DeleteByIdSavedAsync(object id)
         {
             base.DeleteById(id);
-            return _searchEngine.SaveChangesAsync();
+            return SearchEngine.SaveChangesAsync();
         }
 
         /// <summary>
@@ -196,7 +196,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         public override Task<int> DeleteEntitiesSavedAsync(IEnumerable<Post> list)
         {
             base.DeleteEntities(list);
-            return _searchEngine.SaveChangesAsync();
+            return SearchEngine.SaveChangesAsync();
         }
 
         /// <summary>
@@ -207,7 +207,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         public override int DeleteEntitySaved(Expression<Func<Post, bool>> @where)
         {
             base.DeleteEntity(@where);
-            return _searchEngine.SaveChanges();
+            return SearchEngine.SaveChanges();
         }
 
         /// <summary>
@@ -218,7 +218,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         public override bool DeleteEntitySaved(Post t)
         {
             base.DeleteEntity(t);
-            return _searchEngine.SaveChanges() > 0;
+            return SearchEngine.SaveChanges() > 0;
         }
 
         /// <summary>
@@ -229,7 +229,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         public override Task<int> DeleteEntitySavedAsync(Expression<Func<Post, bool>> @where)
         {
             base.DeleteEntity(@where);
-            return _searchEngine.SaveChangesAsync();
+            return SearchEngine.SaveChangesAsync();
         }
 
         /// <summary>
@@ -240,7 +240,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         public override Task<int> DeleteEntitySavedAsync(Post t)
         {
             base.DeleteEntity(t);
-            return _searchEngine.SaveChangesAsync();
+            return SearchEngine.SaveChangesAsync();
         }
 
         /// <summary>
@@ -249,7 +249,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <returns>受影响的行数</returns>
         public int SaveChanges(bool flushIndex)
         {
-            return flushIndex ? _searchEngine.SaveChanges() : base.SaveChanges();
+            return flushIndex ? SearchEngine.SaveChanges() : base.SaveChanges();
         }
 
         /// <summary>
@@ -258,7 +258,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         /// <returns>受影响的行数</returns>
         public async Task<int> SaveChangesAsync(bool flushIndex)
         {
-            return flushIndex ? await _searchEngine.SaveChangesAsync() : await base.SaveChangesAsync();
+            return flushIndex ? await SearchEngine.SaveChangesAsync() : await base.SaveChangesAsync();
         }
     }
 }

+ 16 - 1
src/Masuit.MyBlogs.Core/Infrastructure/Services/SearchDetailsService.cs

@@ -2,13 +2,28 @@
 using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface;
 using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
 using Masuit.MyBlogs.Core.Models.Entity;
+using System;
+using System.Collections.Generic;
 
 namespace Masuit.MyBlogs.Core.Infrastructure.Services
 {
     public partial class SearchDetailsService : BaseService<SearchDetails>, ISearchDetailsService
     {
-        public SearchDetailsService(IBaseRepository<SearchDetails> repository, ISearchEngine<DataContext> searchEngine, ILuceneIndexSearcher searcher) : base(repository, searchEngine, searcher)
+        private readonly ISearchDetailsRepository _searchDetailsRepository;
+
+        public SearchDetailsService(IBaseRepository<SearchDetails> repository, ISearchEngine<DataContext> searchEngine, ILuceneIndexSearcher searcher, ISearchDetailsRepository searchDetailsRepository) : base(repository, searchEngine, searcher)
+        {
+            _searchDetailsRepository = searchDetailsRepository;
+        }
+
+        /// <summary>
+        /// 搜索统计
+        /// </summary>
+        /// <param name="start"></param>
+        /// <returns></returns>
+        public List<SearchRank> GetRanks(DateTime start)
         {
+            return _searchDetailsRepository.GetRanks(start);
         }
     }
 }

+ 6 - 0
src/Masuit.MyBlogs.Core/Models/Entity/SearchDetails.cs

@@ -34,4 +34,10 @@ namespace Masuit.MyBlogs.Core.Models.Entity
         /// </summary>
         public string IP { get; set; }
     }
+
+    public class SearchRank
+    {
+        public string Keywords { get; set; }
+        public int Count { get; set; }
+    }
 }