LuceneIndexerTests.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using Lucene.Net.Analysis;
  2. using Lucene.Net.Analysis.Standard;
  3. using Lucene.Net.Documents;
  4. using Lucene.Net.Store;
  5. using Masuit.LuceneEFCore.SearchEngine.Test.Helpers;
  6. using Masuit.LuceneEFCore.SearchEngine.Test.Models;
  7. using Microsoft.Extensions.Caching.Memory;
  8. using System.Linq;
  9. using Xunit;
  10. using Xunit.Abstractions;
  11. namespace Masuit.LuceneEFCore.SearchEngine.Test
  12. {
  13. public class LuceneIndexerTests
  14. {
  15. private readonly ITestOutputHelper _output;
  16. private LuceneIndexer _indexer;
  17. public LuceneIndexerTests(ITestOutputHelper output)
  18. {
  19. _output = output;
  20. }
  21. [Fact]
  22. public void AnIndexCanBeCreated()
  23. {
  24. TestDataGenerator tdg = new TestDataGenerator();
  25. Directory directory = new RAMDirectory();
  26. Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.LuceneVersion.LUCENE_48);
  27. _indexer = new LuceneIndexer(directory, analyzer);
  28. _indexer.CreateIndex(tdg.AllData);
  29. Assert.Equal(2000, _indexer.Count());
  30. analyzer.Dispose();
  31. directory.ClearLock("write.lock");
  32. directory.Dispose();
  33. }
  34. [Fact]
  35. public void AnIndexCanBeDeleted()
  36. {
  37. TestDataGenerator tdg = new TestDataGenerator();
  38. Directory directory = new RAMDirectory();
  39. Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.LuceneVersion.LUCENE_48);
  40. _indexer = new LuceneIndexer(directory, analyzer);
  41. _indexer.CreateIndex(tdg.AllData);
  42. Assert.Equal(2000, _indexer.Count());
  43. _indexer.DeleteAll();
  44. Assert.Equal(0, _indexer.Count());
  45. directory.ClearLock("write.lock");
  46. analyzer.Dispose();
  47. directory.Dispose();
  48. }
  49. [Fact]
  50. public void AnItemCanBeAddedToTheIndex()
  51. {
  52. TestDataGenerator tdg = new TestDataGenerator();
  53. Directory directory = new RAMDirectory();
  54. Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.LuceneVersion.LUCENE_48);
  55. _indexer = new LuceneIndexer(directory, analyzer);
  56. _indexer.CreateIndex(tdg.AllData);
  57. Assert.Equal(2000, _indexer.Count());
  58. _indexer.Add(tdg.ANewUser());
  59. Assert.Equal(2001, _indexer.Count());
  60. directory.ClearLock("write.lock");
  61. }
  62. [Fact]
  63. public void AnItemCanBeRemovedFromTheIndex()
  64. {
  65. TestDataGenerator tdg = new TestDataGenerator();
  66. Directory directory = new RAMDirectory();
  67. Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.LuceneVersion.LUCENE_48);
  68. _indexer = new LuceneIndexer(directory, analyzer);
  69. _indexer.CreateIndex(tdg.AllData);
  70. _indexer.Delete(tdg.AllData.First());
  71. Assert.True(tdg.AllData.Count > _indexer.Count());
  72. directory.ClearLock("write.lock");
  73. }
  74. [Fact]
  75. public void AnItemCanBeUpdatedInTheIndex()
  76. {
  77. TestDataGenerator tdg = new TestDataGenerator();
  78. Directory directory = new RAMDirectory();
  79. Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.LuceneVersion.LUCENE_48);
  80. _indexer = new LuceneIndexer(directory, analyzer);
  81. _indexer.CreateIndex(tdg.AllData);
  82. LuceneIndexSearcher searcher = new LuceneIndexSearcher(directory, analyzer, new MemoryCache(new MemoryCacheOptions()));
  83. SearchOptions options = new SearchOptions("[email protected]", "Email");
  84. var initialResults = searcher.ScoredSearch(options);
  85. foreach (var item in initialResults.Results)
  86. {
  87. _output.WriteLine($"{item.Score}\t{item.Document.Get("Id")}\t{item.Document.Get("FirstName")}\t{item.Document.Get("Email")}");
  88. }
  89. Document rambler = initialResults.Results.First().Document;
  90. User user = new User()
  91. {
  92. Id = int.Parse(rambler.Get("Id")),
  93. FirstName = rambler.Get("FirstName"),
  94. Surname = rambler.Get("Surname"),
  95. Email = rambler.Get("Email"),
  96. JobTitle = rambler.Get("JobTitle")
  97. };
  98. user.FirstName = "Duke";
  99. user.Surname = "Nukem";
  100. _indexer.Update(user);
  101. var endResults = searcher.ScoredSearch(options);
  102. foreach (var item in endResults.Results)
  103. {
  104. _output.WriteLine($"{item.Score}\t{item.Document.Get("Id")}\t{item.Document.Get("FirstName")}\t{item.Document.Get("Email")}");
  105. }
  106. Assert.Equal(user.Id.ToString(), endResults.Results.First().Document.Get("Id"));
  107. Assert.Equal(user.FirstName, endResults.Results.First().Document.Get("FirstName"));
  108. Assert.Equal(user.Surname, endResults.Results.First().Document.Get("Surname"));
  109. directory.ClearLock("write.lock");
  110. }
  111. }
  112. }