懒得勤快 6 năm trước cách đây
mục cha
commit
2d273d88bf

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+*/obj
+*/bin
+/.vs

+ 12 - 12
Masuit.LuceneEFCore.SearchEngine.Test/SearchContextTests.cs → Masuit.LuceneEFCore.SearchEngine.Test/SearchEngineTests.cs

@@ -9,13 +9,13 @@ using Xunit.Abstractions;
 namespace Masuit.LuceneEFCore.SearchEngine.Test
 {
     [Trait("Category", "SearchContext")]
-    public class SearchContextTests
+    public class SearchEngineTests
     {
         private TestDbContext _context;
         private readonly ITestOutputHelper _output;
         string _tempName;
 
-        public SearchContextTests(ITestOutputHelper output)
+        public SearchEngineTests(ITestOutputHelper output)
         {
             _output = output;
         }
@@ -35,7 +35,7 @@ namespace Masuit.LuceneEFCore.SearchEngine.Test
             {
                 UseRamDirectory = true
             };
-            SearchContextProvider<TestDbContext> searchProvider = new SearchContextProvider<TestDbContext>(options, _context);
+            SearchEngine<TestDbContext> searchProvider = new SearchEngine<TestDbContext>(options, _context);
 
             searchProvider.CreateIndex();
 
@@ -55,7 +55,7 @@ namespace Masuit.LuceneEFCore.SearchEngine.Test
             {
                 UseRamDirectory = true
             };
-            SearchContextProvider<TestDbContext> searchProvider = new SearchContextProvider<TestDbContext>(options, _context);
+            SearchEngine<TestDbContext> searchProvider = new SearchEngine<TestDbContext>(options, _context);
 
             searchProvider.CreateIndex();
 
@@ -78,7 +78,7 @@ namespace Masuit.LuceneEFCore.SearchEngine.Test
             {
                 UseRamDirectory = true
             };
-            SearchContextProvider<TestDbContext> searchProvider = new SearchContextProvider<TestDbContext>(options, _context);
+            SearchEngine<TestDbContext> searchProvider = new SearchEngine<TestDbContext>(options, _context);
 
             searchProvider.CreateIndex();
 
@@ -111,7 +111,7 @@ namespace Masuit.LuceneEFCore.SearchEngine.Test
             {
                 UseRamDirectory = true
             };
-            SearchContextProvider<TestDbContext> searchProvider = new SearchContextProvider<TestDbContext>(options, _context);
+            SearchEngine<TestDbContext> searchProvider = new SearchEngine<TestDbContext>(options, _context);
 
             searchProvider.CreateIndex();
 
@@ -136,7 +136,7 @@ namespace Masuit.LuceneEFCore.SearchEngine.Test
             {
                 UseRamDirectory = true
             };
-            SearchContextProvider<TestDbContext> searchProvider = new SearchContextProvider<TestDbContext>(options, _context);
+            SearchEngine<TestDbContext> searchProvider = new SearchEngine<TestDbContext>(options, _context);
 
             searchProvider.CreateIndex();
 
@@ -159,7 +159,7 @@ namespace Masuit.LuceneEFCore.SearchEngine.Test
             {
                 UseRamDirectory = true
             };
-            SearchContextProvider<TestDbContext> searchProvider = new SearchContextProvider<TestDbContext>(options, _context);
+            SearchEngine<TestDbContext> searchProvider = new SearchEngine<TestDbContext>(options, _context);
 
             searchProvider.CreateIndex();
 
@@ -186,7 +186,7 @@ namespace Masuit.LuceneEFCore.SearchEngine.Test
             {
                 UseRamDirectory = true
             };
-            SearchContextProvider<TestDbContext> searchProvider = new SearchContextProvider<TestDbContext>(options, _context);
+            SearchEngine<TestDbContext> searchProvider = new SearchEngine<TestDbContext>(options, _context);
 
             searchProvider.CreateIndex();
 
@@ -210,7 +210,7 @@ namespace Masuit.LuceneEFCore.SearchEngine.Test
             {
                 UseRamDirectory = true
             };
-            SearchContextProvider<TestDbContext> searchProvider = new SearchContextProvider<TestDbContext>(options, _context);
+            SearchEngine<TestDbContext> searchProvider = new SearchEngine<TestDbContext>(options, _context);
 
             User jc = new User()
             {
@@ -245,7 +245,7 @@ namespace Masuit.LuceneEFCore.SearchEngine.Test
             {
                 UseRamDirectory = true
             };
-            SearchContextProvider<TestDbContext> searchProvider = new SearchContextProvider<TestDbContext>(options, _context);
+            SearchEngine<TestDbContext> searchProvider = new SearchEngine<TestDbContext>(options, _context);
 
             searchProvider.CreateIndex();
 
@@ -280,7 +280,7 @@ namespace Masuit.LuceneEFCore.SearchEngine.Test
             {
                 UseRamDirectory = true
             };
-            SearchContextProvider<TestDbContext> searchProvider = new SearchContextProvider<TestDbContext>(options, _context);
+            SearchEngine<TestDbContext> searchProvider = new SearchEngine<TestDbContext>(options, _context);
 
             searchProvider.CreateIndex();
 

+ 0 - 6
Masuit.LuceneEFCore.SearchEngine.sln

@@ -7,8 +7,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masuit.LuceneEFCore.SearchE
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masuit.LuceneEFCore.SearchEngine.Test", "Masuit.LuceneEFCore.SearchEngine.Test\Masuit.LuceneEFCore.SearchEngine.Test.csproj", "{0E1A15E2-174C-4FE3-A4CC-A77B9BC326E8}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp1", "ConsoleApp1\ConsoleApp1.csproj", "{6EF46C69-1D78-40A7-8DD1-92E017CC492E}"
-EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -23,10 +21,6 @@ Global
 		{0E1A15E2-174C-4FE3-A4CC-A77B9BC326E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{0E1A15E2-174C-4FE3-A4CC-A77B9BC326E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{0E1A15E2-174C-4FE3-A4CC-A77B9BC326E8}.Release|Any CPU.Build.0 = Release|Any CPU
-		{6EF46C69-1D78-40A7-8DD1-92E017CC492E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{6EF46C69-1D78-40A7-8DD1-92E017CC492E}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{6EF46C69-1D78-40A7-8DD1-92E017CC492E}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{6EF46C69-1D78-40A7-8DD1-92E017CC492E}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 7 - 1
Masuit.LuceneEFCore.SearchEngine/Interfaces/ISearchContextProvider.cs → Masuit.LuceneEFCore.SearchEngine/Interfaces/ISearchEngine.cs

@@ -1,9 +1,10 @@
 using Microsoft.EntityFrameworkCore;
+using System.Collections.Generic;
 using System.Threading.Tasks;
 
 namespace Masuit.LuceneEFCore.SearchEngine.Interfaces
 {
-    public interface ISearchContextProvider<out TContext> where TContext : DbContext
+    public interface ISearchEngine<out TContext> where TContext : DbContext
     {
         /// <summary>
         /// 数据库上下文
@@ -20,6 +21,11 @@ namespace Masuit.LuceneEFCore.SearchEngine.Interfaces
         /// </summary>
         void CreateIndex();
 
+        /// <summary>
+        /// 创建指定数据表的索引
+        /// </summary>
+        void CreateIndex(List<string> tables);
+
         /// <summary>
         /// 删除索引
         /// </summary>

+ 8 - 0
Masuit.LuceneEFCore.SearchEngine/Masuit.LuceneEFCore.SearchEngine.csproj

@@ -2,6 +2,14 @@
 
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
+    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
+    <Authors>懒得勤快</Authors>
+    <Company>懒得勤快懒得勤快</Company>
+    <Product>基于EntityFrameworkCore和Lucene.NET实现的全文检索搜索引擎</Product>
+    <Description>基于EntityFrameworkCore和Lucene.NET实现的全文检索搜索引擎</Description>
+    <Copyright>懒得勤快</Copyright>
+    <PackageProjectUrl>https://github.com/ldqk/Masuit.LuceneEFCore.SearchEngine</PackageProjectUrl>
+    <PackageId>Masuit.LuceneEFCore.SearchEngine_int</PackageId>
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="HtmlAgilityPack" Version="1.8.14" />

+ 54 - 29
Masuit.LuceneEFCore.SearchEngine/SearchContextProvider.cs → Masuit.LuceneEFCore.SearchEngine/SearchEngine.cs

@@ -19,26 +19,31 @@ namespace Masuit.LuceneEFCore.SearchEngine
     /// 搜索引擎
     /// </summary>
     /// <typeparam name="TContext"></typeparam>
-    public class SearchContextProvider<TContext> : ISearchContextProvider<TContext> where TContext : DbContext
+    public class SearchEngine<TContext> : ISearchEngine<TContext> where TContext : DbContext
     {
         /// <summary>
         /// 数据库上下文
         /// </summary>
         public TContext Context { get; protected set; }
 
-        private static Directory directory;
-        private static Analyzer analyzer;
-        private static LuceneIndexer indexer;
-        private static LuceneIndexSearcher searcher;
+        private static Directory _directory;
+        private static Analyzer _analyzer;
+        private static LuceneIndexer _indexer;
+        private static LuceneIndexSearcher _searcher;
         private static bool isInitialized = false;
 
+        /// <summary>
+        /// 索引条数
+        /// </summary>
+        public int IndexCount => _indexer.Count();
+
         /// <summary>
         /// 搜索引擎
         /// </summary>
         /// <param name="indexerOptions">索引选项</param>
         /// <param name="context">数据库上下文</param>
         /// <param name="overrideIfExists">是否被覆盖</param>
-        public SearchContextProvider(LuceneIndexerOptions indexerOptions, TContext context, bool overrideIfExists = false)
+        public SearchEngine(LuceneIndexerOptions indexerOptions, TContext context, bool overrideIfExists = false)
         {
             if (isInitialized == false || overrideIfExists)
             {
@@ -56,19 +61,19 @@ namespace Masuit.LuceneEFCore.SearchEngine
         {
             if (options.UseRamDirectory)
             {
-                directory = new RAMDirectory();
+                _directory = new RAMDirectory();
             }
             else
             {
-                if (directory == null)
+                if (_directory == null)
                 {
-                    directory = FSDirectory.Open(options.Path);
+                    _directory = FSDirectory.Open(options.Path);
                 }
             }
 
-            analyzer = new JieBaAnalyzer(TokenizerMode.Search);
-            indexer = new LuceneIndexer(directory, analyzer);
-            searcher = new LuceneIndexSearcher(directory, analyzer);
+            _analyzer = new JieBaAnalyzer(TokenizerMode.Search);
+            _indexer = new LuceneIndexer(_directory, _analyzer);
+            _searcher = new LuceneIndexSearcher(_directory, _analyzer);
         }
 
         /// <summary>
@@ -148,7 +153,7 @@ namespace Masuit.LuceneEFCore.SearchEngine
                 result = Context.SaveChanges();
                 if (changes.HasChanges && index)
                 {
-                    indexer.Update(changes);
+                    _indexer.Update(changes);
                 }
             }
 
@@ -171,7 +176,7 @@ namespace Masuit.LuceneEFCore.SearchEngine
                 result = await Context.SaveChangesAsync();
                 if (changes.HasChanges && index)
                 {
-                    indexer.Update(changes);
+                    _indexer.Update(changes);
                 }
             }
 
@@ -179,30 +184,42 @@ namespace Masuit.LuceneEFCore.SearchEngine
         }
 
         /// <summary>
-        /// 索引条数
-        /// </summary>
-        public int IndexCount => indexer.Count();
-
-        /// <summary>
-        /// 删除索引
+        /// 扫描数据库上下文并对所有已实现ILuceneIndexable的对象,并创建索引
         /// </summary>
-        public void DeleteIndex()
+        public void CreateIndex()
         {
-            indexer?.DeleteAll();
+            if (_indexer != null)
+            {
+                List<ILuceneIndexable> index = new List<ILuceneIndexable>();
+                PropertyInfo[] properties = Context.GetType().GetProperties();
+                foreach (PropertyInfo pi in properties)
+                {
+                    if (typeof(IEnumerable<ILuceneIndexable>).IsAssignableFrom(pi.PropertyType))
+                    {
+                        var entities = Context.GetType().GetProperty(pi.Name).GetValue(Context, null);
+                        index.AddRange(entities as IEnumerable<ILuceneIndexable>);
+                    }
+                }
+
+                if (index.Any())
+                {
+                    _indexer.CreateIndex(index);
+                }
+            }
         }
 
         /// <summary>
-        /// 扫描数据库上下文并对所有已实现ILuceneIndexable的对象,并创建索引
+        /// 创建指定数据表的索引
         /// </summary>
-        public void CreateIndex()
+        public void CreateIndex(List<string> tables)
         {
-            if (indexer != null)
+            if (_indexer != null)
             {
                 List<ILuceneIndexable> index = new List<ILuceneIndexable>();
                 PropertyInfo[] properties = Context.GetType().GetProperties();
                 foreach (PropertyInfo pi in properties)
                 {
-                    if (typeof(IEnumerable<ILuceneIndexable>).IsAssignableFrom(pi.PropertyType))
+                    if (typeof(IEnumerable<ILuceneIndexable>).IsAssignableFrom(pi.PropertyType) && tables.Contains(pi.Name))
                     {
                         var entities = Context.GetType().GetProperty(pi.Name).GetValue(Context, null);
                         index.AddRange(entities as IEnumerable<ILuceneIndexable>);
@@ -211,11 +228,19 @@ namespace Masuit.LuceneEFCore.SearchEngine
 
                 if (index.Any())
                 {
-                    indexer.CreateIndex(index);
+                    _indexer.CreateIndex(index);
                 }
             }
         }
 
+        /// <summary>
+        /// 删除索引
+        /// </summary>
+        public void DeleteIndex()
+        {
+            _indexer?.DeleteAll();
+        }
+
         /// <summary>
         /// 执行搜索并将结果限制为特定类型,在返回之前,搜索结果将转换为相关类型,但不返回任何评分信息
         /// </summary>
@@ -225,7 +250,7 @@ namespace Masuit.LuceneEFCore.SearchEngine
         public ISearchResultCollection<T> Search<T>(SearchOptions options)
         {
             options.Type = typeof(T);
-            var indexResults = searcher.ScoredSearch(options);
+            var indexResults = _searcher.ScoredSearch(options);
 
             ISearchResultCollection<T> resultSet = new SearchResultCollection<T>()
             {
@@ -259,7 +284,7 @@ namespace Masuit.LuceneEFCore.SearchEngine
                 options.Type = typeof(T);
             }
 
-            var indexResults = searcher.ScoredSearch(options);
+            var indexResults = _searcher.ScoredSearch(options);
 
             IScoredSearchResultCollection<T> results = new ScoredSearchResultCollection<T>();
             results.TotalHits = indexResults.TotalHits;