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(); }
public SearchController(AppDbContext appDbContext, LuceneIndexerOptions luceneIndexerOptions, SearchableContextProvider <AppDbContext> searchProvider) { _appDbContext = appDbContext; _luceneIndexerOptions = luceneIndexerOptions; _searchProvider = searchProvider; }
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(); }
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); }
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(); }
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(); }
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(); }
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); }
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); }
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); }
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(); }
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); }
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); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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("索引库创建完成!"); } }