LuceneIndexerTests.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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 System;
  8. using System.Linq;
  9. using Xunit;
  10. using Xunit.Abstractions;
  11. namespace Masuit.LuceneEFCore.SearchEngine.Test
  12. {
  13. [Trait("Category", "LuceneIndexer")]
  14. public class LuceneIndexerTests : IDisposable
  15. {
  16. private readonly ITestOutputHelper _output;
  17. private LuceneIndexer _indexer;
  18. public LuceneIndexerTests(ITestOutputHelper output)
  19. {
  20. _output = output;
  21. }
  22. public void Dispose()
  23. {
  24. }
  25. [Fact]
  26. public void AnIndexCanBeCreated()
  27. {
  28. TestDataGenerator tdg = new TestDataGenerator();
  29. Directory directory = new RAMDirectory();
  30. Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.LuceneVersion.LUCENE_48);
  31. _indexer = new LuceneIndexer(directory, analyzer);
  32. _indexer.CreateIndex(tdg.AllData);
  33. Assert.Equal(2000, _indexer.Count());
  34. analyzer.Dispose();
  35. directory.ClearLock("write.lock");
  36. directory.Dispose();
  37. }
  38. [Fact]
  39. public void AnIndexCanBeDeleted()
  40. {
  41. TestDataGenerator tdg = new TestDataGenerator();
  42. Directory directory = new RAMDirectory();
  43. Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.LuceneVersion.LUCENE_48);
  44. _indexer = new LuceneIndexer(directory, analyzer);
  45. _indexer.CreateIndex(tdg.AllData);
  46. Assert.Equal(2000, _indexer.Count());
  47. _indexer.DeleteAll();
  48. Assert.Equal(0, _indexer.Count());
  49. directory.ClearLock("write.lock");
  50. analyzer.Dispose();
  51. directory.Dispose();
  52. }
  53. [Fact]
  54. public void AnItemCanBeAddedToTheIndex()
  55. {
  56. TestDataGenerator tdg = new TestDataGenerator();
  57. Directory directory = new RAMDirectory();
  58. Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.LuceneVersion.LUCENE_48);
  59. _indexer = new LuceneIndexer(directory, analyzer);
  60. _indexer.CreateIndex(tdg.AllData);
  61. Assert.Equal(2000, _indexer.Count());
  62. _indexer.Add(tdg.ANewUser());
  63. Assert.Equal(2001, _indexer.Count());
  64. directory.ClearLock("write.lock");
  65. }
  66. [Fact]
  67. public void AnItemCanBeRemovedFromTheIndex()
  68. {
  69. TestDataGenerator tdg = new TestDataGenerator();
  70. Directory directory = new RAMDirectory();
  71. Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.LuceneVersion.LUCENE_48);
  72. _indexer = new LuceneIndexer(directory, analyzer);
  73. _indexer.CreateIndex(tdg.AllData);
  74. _indexer.Delete(tdg.AllData.First());
  75. Assert.True(tdg.AllData.Count > _indexer.Count());
  76. directory.ClearLock("write.lock");
  77. }
  78. [Fact]
  79. public void AnItemCanBeUpdatedInTheIndex()
  80. {
  81. TestDataGenerator tdg = new TestDataGenerator();
  82. Directory directory = new RAMDirectory();
  83. Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.LuceneVersion.LUCENE_48);
  84. _indexer = new LuceneIndexer(directory, analyzer);
  85. _indexer.CreateIndex(tdg.AllData);
  86. // we need a searcher for this test
  87. LuceneIndexSearcher searcher = new LuceneIndexSearcher(directory, analyzer);
  88. // get the 1st item
  89. SearchOptions options = new SearchOptions("[email protected]", "Email");
  90. var initialResults = searcher.ScoredSearch(options);
  91. foreach (var item in initialResults.Results)
  92. {
  93. _output.WriteLine($"{item.Score}\t{item.Document.Get("Id")}\t{item.Document.Get("FirstName")}\t{item.Document.Get("Email")}");
  94. }
  95. //Assert.Equal(1, initialResults.TotalHits);
  96. Document rambler = initialResults.Results.First().Document;
  97. // convert to ILuceneIndexable
  98. User user = new User()
  99. {
  100. Id = int.Parse(rambler.Get("Id")),
  101. FirstName = rambler.Get("FirstName"),
  102. Surname = rambler.Get("Surname"),
  103. Email = rambler.Get("Email"),
  104. JobTitle = rambler.Get("JobTitle")
  105. };
  106. // make an edit
  107. user.FirstName = "Duke";
  108. user.Surname = "Nukem";
  109. // add the update to the indexer
  110. _indexer.Update(user);
  111. // search again
  112. var endResults = searcher.ScoredSearch(options);
  113. foreach (var item in endResults.Results)
  114. {
  115. _output.WriteLine($"{item.Score}\t{item.Document.Get("Id")}\t{item.Document.Get("FirstName")}\t{item.Document.Get("Email")}");
  116. }
  117. // Assert.Equal(1, endResults.TotalHits);
  118. Assert.Equal(user.Id.ToString(), endResults.Results.First().Document.Get("Id"));
  119. Assert.Equal(user.FirstName, endResults.Results.First().Document.Get("FirstName"));
  120. Assert.Equal(user.Surname, endResults.Results.First().Document.Get("Surname"));
  121. directory.ClearLock("write.lock");
  122. }
  123. }
  124. }