Example #1
0
        public void ASearchCanOrderByMultipleFields()
        {
            InitializeContext();
            LuceneIndexerOptions options = new LuceneIndexerOptions()
            {
                Path = "lucene"
            };
            var           memoryCache = new MemoryCache(new MemoryCacheOptions());
            var           directory   = FSDirectory.Open(options.Path);
            JieBaAnalyzer analyzer    = new JieBaAnalyzer(TokenizerMode.Search);
            SearchEngine <TestDbContext> searchProvider = new SearchEngine <TestDbContext>(_context, directory, analyzer, memoryCache);
            User jc = new User()
            {
                FirstName = "John",
                Surname   = "Chapman",
                JobTitle  = "Test Engineer",
                Email     = "*****@*****.**"
            };

            _context.Users.Add(jc);
            _context.SaveChanges();
            searchProvider.CreateIndex();
            SearchOptions search = new SearchOptions("John", "FirstName", 1000, null, null, "Surname,JobTitle");

            var results      = searchProvider.ScoredSearch <User>(search);
            var topResult    = results.Results[0];
            var secondResult = results.Results[1];

            Assert.Equal("Sales Associate", topResult.Entity.JobTitle);
            Assert.Equal("Test Engineer", secondResult.Entity.JobTitle);

            searchProvider.DeleteIndex();
        }
Example #2
0
 public SearchController(AppDbContext appDbContext, LuceneIndexerOptions luceneIndexerOptions,
                         SearchableContextProvider <AppDbContext> searchProvider)
 {
     _appDbContext         = appDbContext;
     _luceneIndexerOptions = luceneIndexerOptions;
     _searchProvider       = searchProvider;
 }
Example #3
0
        public void AScoredSearchWillOrderByRelevence()
        {
            InitializeContext();
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions {
                UseRamDirectory = true
            };

            searchProvider.Initialize(options, context);

            searchProvider.CreateIndex();

            SearchOptions searchOptions = new SearchOptions("Jeremy Burns", "FirstName,Surname");

            var results = searchProvider.ScoredSearch <User>(searchOptions);

            var first   = results.Results.First().Entity;
            var highest = results.Results.First().Score;
            var lowest  = results.Results.Last().Score;

            Assert.True(highest > lowest);
            Assert.Equal("Jeremy", first.FirstName);
            Assert.Equal("Burns", first.Surname);

            searchProvider.DeleteIndex();
        }
Example #4
0
        public void SaveChangesUpdatesEntitiesAddedToTheIndex()
        {
            InitializeContext();
            LuceneIndexerOptions options = new LuceneIndexerOptions()
            {
                Path = "lucene"
            };
            var           memoryCache = new MemoryCache(new MemoryCacheOptions());
            var           directory   = FSDirectory.Open(options.Path);
            JieBaAnalyzer analyzer    = new JieBaAnalyzer(TokenizerMode.Search);
            SearchEngine <TestDbContext> searchProvider = new SearchEngine <TestDbContext>(_context, directory, analyzer, memoryCache);

            searchProvider.CreateIndex();
            var newUser = new User()
            {
                FirstName = "Duke",
                Surname   = "Nukem",
                Email     = "*****@*****.**",
                JobTitle  = "Shooty Man"
            };
            var search = new SearchOptions("Nukem", "Surname");

            var initialResults = searchProvider.Search <User>(search);

            searchProvider.Context.Users.Add(newUser);
            searchProvider.SaveChanges();
            var newResults = searchProvider.Search <User>(search);

            Assert.Equal(0, initialResults.TotalHits);
            Assert.Equal(1, newResults.TotalHits);
            Assert.Equal(newUser.Id, newResults.Results[0].Id);
        }
Example #5
0
        public void SaveChangesDeletesRemovedEntitiesFromTheIndex()
        {
            InitializeContext();
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions {
                UseRamDirectory = true
            };

            searchProvider.Initialize(options, context);
            searchProvider.CreateIndex();

            var search = new SearchOptions("John", "FirstName");

            int initialIndexCount = searchProvider.IndexCount;

            var initialResults = searchProvider.Search <User>(search);
            int resultsCount   = initialResults.TotalHits;

            // delete entities
            //
            // NOTE: Because the search result entities are attached to the context
            // we can easily do linq operations on them
            //
            searchProvider.Context.Users.RemoveRange(initialResults.Results);
            searchProvider.SaveChanges(true);

            var updatedSearch   = searchProvider.Search <User>(search);
            int finalIndexCount = searchProvider.IndexCount;

            Assert.Equal(0, updatedSearch.TotalHits);
            Assert.Equal(0, updatedSearch.Results.Count);
            Assert.Equal((initialIndexCount - resultsCount), finalIndexCount);
        }
        public void ASearchCanOrderByMultipleFields()
        {
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions(null, null, true);

            User jc = new User()
            {
                FirstName = "John",
                Surname   = "Chapman",
                JobTitle  = "Test Engineer",
                IndexId   = Guid.NewGuid(),
                Email     = "*****@*****.**"
            };

            searchProvider.Initialize(options, context);

            context.Users.Add(jc);
            context.SaveChanges();

            searchProvider.CreateIndex();

            SearchOptions search = new SearchOptions("John", "FirstName", 1000, null, null, "Surname,JobTitle");

            var results = searchProvider.ScoredSearch <User>(search);

            var topResult    = results.Results[0];
            var secondResult = results.Results[1];

            Assert.AreEqual("Sales Associate", topResult.Entity.JobTitle);
            Assert.AreEqual("Test Engineer", secondResult.Entity.JobTitle);

            searchProvider.DeleteIndex();
        }
Example #7
0
        public void SkipAndTakeWorkWhenSearchingUsingAContextProvider()
        {
            InitializeContext();
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions {
                UseRamDirectory = true
            };

            searchProvider.Initialize(options, context);

            searchProvider.CreateIndex();

            SearchOptions searchOptions = new SearchOptions("John", "FirstName");

            // test
            var initialResults = searchProvider.ScoredSearch <User>(searchOptions);
            int lastId         = initialResults.Results[4].Entity.Id;

            Assert.Equal(5, initialResults.TotalHits);
            Assert.Equal(5, initialResults.Results.Count());

            searchOptions.Skip = 4;
            searchOptions.Take = 1;
            var subResults = searchProvider.ScoredSearch <User>(searchOptions);

            Assert.Equal(5, subResults.TotalHits);
            Assert.Equal(1, subResults.Results.Count());
            Assert.Equal(lastId, subResults.Results.First().Entity.Id);

            // cleanup
            searchProvider.DeleteIndex();
        }
Example #8
0
        public void AScoredSearchWillOrderByRelevence()
        {
            InitializeContext();
            LuceneIndexerOptions options = new LuceneIndexerOptions()
            {
                Path = "lucene"
            };
            var           memoryCache = new MemoryCache(new MemoryCacheOptions());
            var           directory   = FSDirectory.Open(options.Path);
            JieBaAnalyzer analyzer    = new JieBaAnalyzer(TokenizerMode.Search);
            SearchEngine <TestDbContext> searchProvider = new SearchEngine <TestDbContext>(_context, directory, analyzer, memoryCache);

            searchProvider.CreateIndex();
            SearchOptions searchOptions = new SearchOptions("Burns", "FirstName,Surname");

            var results = searchProvider.ScoredSearch <User>(searchOptions);
            var first   = results.Results.First().Entity;
            var highest = results.Results.First().Score;
            var lowest  = results.Results.Last().Score;

            Assert.True(highest > lowest);
            Assert.Equal("Jeremy", first.FirstName);
            Assert.Equal("Burns", first.Surname);

            searchProvider.DeleteIndex();
        }
Example #9
0
        public void SaveChangesUpdatesEntitiesAddedToTheIndex()
        {
            InitializeContext();
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions {
                UseRamDirectory = true
            };

            searchProvider.Initialize(options, context);
            searchProvider.CreateIndex();

            var newUser = new User()
            {
                FirstName = "Duke",
                Surname   = "Nukem",
                Email     = "*****@*****.**",
                IndexId   = Guid.NewGuid(),
                JobTitle  = "Shooty Man"
            };

            var search = new SearchOptions("Nukem", "Surname");

            var initialResults = searchProvider.Search <User>(search);

            searchProvider.Context.Users.Add(newUser);
            searchProvider.SaveChanges(true);

            var newResults = searchProvider.Search <User>(search);

            Assert.Equal(0, initialResults.TotalHits);
            Assert.Equal(1, newResults.TotalHits);

            Assert.Equal(newUser.Id, newResults.Results[0].Id);
        }
Example #10
0
        public void SkipAndTakeWorkWhenSearchingUsingAContextProvider()
        {
            InitializeContext();
            LuceneIndexerOptions options = new LuceneIndexerOptions()
            {
                Path = "lucene"
            };
            var           memoryCache = new MemoryCache(new MemoryCacheOptions());
            var           directory   = FSDirectory.Open(options.Path);
            JieBaAnalyzer analyzer    = new JieBaAnalyzer(TokenizerMode.Search);
            SearchEngine <TestDbContext> searchProvider = new SearchEngine <TestDbContext>(_context, directory, analyzer, memoryCache);

            searchProvider.CreateIndex();
            SearchOptions searchOptions = new SearchOptions("John", "FirstName");

            var initialResults = searchProvider.ScoredSearch <User>(searchOptions);
            var lastId         = initialResults.Results[4].Entity.Id;

            Assert.Equal(5, initialResults.TotalHits);
            Assert.Equal(5, initialResults.Results.Count);

            searchOptions.Skip = 4;
            searchOptions.Take = 1;
            var subResults = searchProvider.ScoredSearch <User>(searchOptions);

            Assert.Equal(5, subResults.TotalHits);
            Assert.Equal(1, subResults.Results.Count);
            Assert.Equal(lastId, subResults.Results.First().Entity.Id);

            searchProvider.DeleteIndex();
        }
        public void ASearchCanIncludeAnOrderBy()
        {
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions(null, null, true);

            searchProvider.Initialize(options, context);
            searchProvider.CreateIndex();

            SearchOptions search = new SearchOptions("Jeremy", "FirstName", 5, null, null, "Surname");

            var results = searchProvider.ScoredSearch <User>(search);
        }
        public void NonValidEntitiesAreIgnored()
        {
            SearchableContextProvider <MockNonIndexableContext> searchProvider = new SearchableContextProvider <MockNonIndexableContext>();

            LuceneIndexerOptions indexerOptions = new LuceneIndexerOptions(null, null, true);

            searchProvider.Initialize(indexerOptions);

            searchProvider.CreateIndex();

            Assert.AreEqual(0, searchProvider.IndexCount);
        }
Example #13
0
        public void NonValidEntitiesAreIgnored()
        {
            InitializeContext();
            LuceneIndexerOptions options = new LuceneIndexerOptions()
            {
                Path = "lucene"
            };
            SearchEngine <TestDbContext> searchProvider = new SearchEngine <TestDbContext>(options, _context, new MemoryCache(new MemoryCacheOptions()));

            searchProvider.CreateIndex();

            Assert.True(searchProvider.IndexCount > 0);
        }
Example #14
0
        public void AContextProviderCanIndexADatabase()
        {
            InitializeContext();
            LuceneIndexerOptions options = new LuceneIndexerOptions()
            {
                Path = "lucene"
            };
            SearchEngine <TestDbContext> searchProvider = new SearchEngine <TestDbContext>(options, _context, new MemoryCache(new MemoryCacheOptions()));

            searchProvider.CreateIndex();

            Assert.Equal(2000, searchProvider.IndexCount);
            searchProvider.DeleteIndex();
        }
        public void ASearchCanReturnMultipleEntityTypes()
        {
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions(null, null, true);

            searchProvider.Initialize(options, context);
            searchProvider.CreateIndex();

            SearchOptions query = new SearchOptions("John China", "FirstName,Country");

            var resultSet = searchProvider.ScoredSearch(query);

            Assert.AreNotEqual(resultSet.Results.First().Entity.Type, resultSet.Results.Last().Entity.Type);
        }
        public void AContextProviderCanIndexADatabase()
        {
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions(null, null, true);

            searchProvider.Initialize(options, context);

            searchProvider.CreateIndex();

            Assert.AreEqual(2000, searchProvider.IndexCount);

            // cleanup
            searchProvider.DeleteIndex();
        }
Example #17
0
        public void NonValidEntitiesAreIgnored()
        {
            InitializeContext();
            SearchableContextProvider <MockNonIndexableContext> searchProvider = new SearchableContextProvider <MockNonIndexableContext>();

            LuceneIndexerOptions indexerOptions = new LuceneIndexerOptions {
                UseRamDirectory = true
            };

            searchProvider.Initialize(indexerOptions);

            searchProvider.CreateIndex();

            Assert.Equal(0, searchProvider.IndexCount);
        }
        public void ASearchCanBeOrderedAcrossTypes()
        {
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions(null, null, true);

            searchProvider.Initialize(options, context);
            searchProvider.CreateIndex();

            SearchOptions query = new SearchOptions("Moore China", "Surname,Country");

            query.OrderBy.Add("Name");

            var resultSet = searchProvider.ScoredSearch(query);

            Assert.AreNotEqual(resultSet.Results.First().Entity.Type, resultSet.Results.Last().Entity.Type);
        }
Example #19
0
        public void NonValidEntitiesAreIgnored()
        {
            InitializeContext();
            LuceneIndexerOptions options = new LuceneIndexerOptions()
            {
                Path = "lucene"
            };
            var           memoryCache = new MemoryCache(new MemoryCacheOptions());
            var           directory   = FSDirectory.Open(options.Path);
            JieBaAnalyzer analyzer    = new JieBaAnalyzer(TokenizerMode.Search);
            SearchEngine <TestDbContext> searchProvider = new SearchEngine <TestDbContext>(_context, directory, analyzer, memoryCache);

            searchProvider.CreateIndex();

            Assert.True(searchProvider.IndexCount > 0);
        }
Example #20
0
        public void AContextProviderCanIndexADatabase()
        {
            InitializeContext();
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions {
                UseRamDirectory = true
            };

            searchProvider.Initialize(options, context);

            searchProvider.CreateIndex();

            Assert.Equal(2000, searchProvider.IndexCount);

            // cleanup
            searchProvider.DeleteIndex();
        }
Example #21
0
        public void AContextProviderCanIndexADatabase()
        {
            InitializeContext();
            LuceneIndexerOptions options = new LuceneIndexerOptions()
            {
                Path = "lucene"
            };
            var           memoryCache = new MemoryCache(new MemoryCacheOptions());
            var           directory   = FSDirectory.Open(options.Path);
            JieBaAnalyzer analyzer    = new JieBaAnalyzer(TokenizerMode.Search);
            SearchEngine <TestDbContext> searchProvider = new SearchEngine <TestDbContext>(_context, directory, analyzer, memoryCache);

            searchProvider.CreateIndex();

            Assert.Equal(2000, searchProvider.IndexCount);
            searchProvider.DeleteIndex();
        }
Example #22
0
        public void AContextCanBeSearchedUsingAContextProvider()
        {
            InitializeContext();

            LuceneIndexerOptions options = new LuceneIndexerOptions()
            {
                Path = "lucene"
            };
            SearchEngine <TestDbContext> searchProvider = new SearchEngine <TestDbContext>(options, _context, new MemoryCache(new MemoryCacheOptions()));

            searchProvider.CreateIndex();
            SearchOptions searchOptions = new SearchOptions("John", "FirstName");

            var results = searchProvider.ScoredSearch <User>(searchOptions);

            Assert.Equal(5, results.TotalHits);
            searchProvider.DeleteIndex();
        }
        public void AContextCanBeSearchedUsingAContextProvider()
        {
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions(null, null, true);

            searchProvider.Initialize(options, context);

            searchProvider.CreateIndex();

            SearchOptions searchOptions = new SearchOptions("John", "FirstName");

            // test
            var results = searchProvider.ScoredSearch <User>(searchOptions);

            Assert.AreEqual(5, results.TotalHits);

            // cleanup
            searchProvider.DeleteIndex();
        }
Example #24
0
        public void ASearchWillReturnTheSameResultsAsAScoredSearch()
        {
            InitializeContext();
            LuceneIndexerOptions options = new LuceneIndexerOptions()
            {
                Path = "lucene"
            };
            SearchEngine <TestDbContext> searchProvider = new SearchEngine <TestDbContext>(options, _context, new MemoryCache(new MemoryCacheOptions()));

            searchProvider.CreateIndex();
            SearchOptions searchOptions = new SearchOptions("Joh*", "FirstName");

            // test
            var results = searchProvider.Search <User>(searchOptions);

            Assert.Equal(10, results.TotalHits);

            searchProvider.DeleteIndex();
        }
        public void ASearchWillReturnTheSameResultsAsAScoredSearch()
        {
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions(null, null, true);

            searchProvider.Initialize(options, context);

            searchProvider.CreateIndex();

            SearchOptions searchOptions = new SearchOptions("Joh*", "FirstName");

            // test
            var results = searchProvider.Search <User>(searchOptions);

            Assert.AreEqual(10, results.TotalHits);

            // cleanup
            searchProvider.DeleteIndex();
        }
        public void ASearchWillStillOrderByRelevence()
        {
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions(null, null, true);

            searchProvider.Initialize(options, context);

            searchProvider.CreateIndex();

            SearchOptions searchOptions = new SearchOptions("Jeremy Burns", "FirstName,Surname");

            var results = searchProvider.Search <User>(searchOptions);

            var first = results.Results.First();

            Assert.AreEqual("Jeremy", first.FirstName);
            Assert.AreEqual("Burns", first.Surname);

            searchProvider.DeleteIndex();
        }
Example #27
0
        public void ASearchWillStillOrderByRelevence()
        {
            InitializeContext();
            LuceneIndexerOptions options = new LuceneIndexerOptions()
            {
                Path = "lucene"
            };
            SearchEngine <TestDbContext> searchProvider = new SearchEngine <TestDbContext>(options, _context, new MemoryCache(new MemoryCacheOptions()));

            searchProvider.CreateIndex();
            SearchOptions searchOptions = new SearchOptions("Jeremy Burns", "FirstName,Surname");

            var results = searchProvider.Search <User>(searchOptions);
            var first   = results.Results.First();

            Assert.Equal("Jeremy", first.FirstName);
            Assert.Equal("Burns", first.Surname);

            searchProvider.DeleteIndex();
        }
Example #28
0
        public void AContextCanBeSearchedUsingAContextProvider()
        {
            InitializeContext();

            LuceneIndexerOptions options = new LuceneIndexerOptions()
            {
                Path = "lucene"
            };
            var           memoryCache = new MemoryCache(new MemoryCacheOptions());
            var           directory   = FSDirectory.Open(options.Path);
            JieBaAnalyzer analyzer    = new JieBaAnalyzer(TokenizerMode.Search);
            SearchEngine <TestDbContext> searchProvider = new SearchEngine <TestDbContext>(_context, directory, analyzer, memoryCache);

            searchProvider.CreateIndex();
            SearchOptions searchOptions = new SearchOptions("John", "FirstName");

            var results = searchProvider.ScoredSearch <User>(searchOptions);

            Assert.Equal(5, results.TotalHits);
            searchProvider.DeleteIndex();
        }
Example #29
0
        public void AContextCanBeSearchedUsingAWildCard()
        {
            InitializeContext();
            SearchableContextProvider <TestDbContext> searchProvider = new SearchableContextProvider <TestDbContext>();
            LuceneIndexerOptions options = new LuceneIndexerOptions {
                UseRamDirectory = true
            };

            searchProvider.Initialize(options, context);

            searchProvider.CreateIndex();

            SearchOptions searchOptions = new SearchOptions("Joh*", "FirstName");

            // test
            var results = searchProvider.ScoredSearch <User>(searchOptions);

            PrintResult(results);

            Assert.Equal(10, results.TotalHits);

            // cleanup
            searchProvider.DeleteIndex();
        }
Example #30
0
        private static void UseLuceneSearch(IHostEnvironment env, IHangfireBackJob hangfire, LuceneIndexerOptions luceneIndexerOptions)
        {
            Task.Run(() =>
            {
                Console.WriteLine("正在导入自定义词库...");
                double time = HiPerfTimer.Execute(() =>
                {
                    var lines     = File.ReadAllLines(Path.Combine(env.ContentRootPath, "App_Data", "CustomKeywords.txt"));
                    var segmenter = new JiebaSegmenter();
                    foreach (var word in lines)
                    {
                        segmenter.AddWord(word);
                    }
                });
                Console.WriteLine($"导入自定义词库完成,耗时{time}s");
            });

            string lucenePath = Path.Combine(env.ContentRootPath, luceneIndexerOptions.Path);

            if (!Directory.Exists(lucenePath) || Directory.GetFiles(lucenePath).Length < 1)
            {
                Console.WriteLine("索引库不存在,开始自动创建Lucene索引库...");
                hangfire.CreateLuceneIndex();
                Console.WriteLine("索引库创建完成!");
            }
        }