|
| 1 | +--- |
| 2 | +uid: releasenotes/4.8.0-beta00013 |
| 3 | +version: 4.8.0-beta00013 |
| 4 | +--- |
| 5 | + |
| 6 | +# Lucene.NET 4.8.0-beta00013 Release Notes |
| 7 | + |
| 8 | +--- |
| 9 | + |
| 10 | +> This release contains important bug fixes and performance enhancements. |
| 11 | +
|
| 12 | +## Benchmarks (from [#310](https://github.com/apache/lucenenet/pull/310)) |
| 13 | + |
| 14 | +#### Index Files |
| 15 | +<details> |
| 16 | + <summary>Click to expand</summary> |
| 17 | + |
| 18 | +``` ini |
| 19 | + |
| 20 | +BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19041.630 (2004/?/20H1) |
| 21 | +Intel Core i7-8850H CPU 2.60GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores |
| 22 | +.NET Core SDK=5.0.100 |
| 23 | + [Host] : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 24 | + 4.8.0-beta00005 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 25 | + 4.8.0-beta00006 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 26 | + 4.8.0-beta00007 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 27 | + 4.8.0-beta00008 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 28 | + 4.8.0-beta00009 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 29 | + 4.8.0-beta00010 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 30 | + 4.8.0-beta00011 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 31 | + 4.8.0-beta00012 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 32 | + 4.8.0-beta00013 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 33 | + |
| 34 | +InvocationCount=1 IterationCount=15 LaunchCount=2 |
| 35 | +UnrollFactor=1 WarmupCount=10 |
| 36 | + |
| 37 | +``` |
| 38 | +| Method | Job | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |
| 39 | +|----------- |---------------- |---------:|---------:|---------:|-----------:|----------:|----------:|----------:| |
| 40 | +| IndexFiles | 4.8.0-beta00005 | 628.1 ms | 8.41 ms | 12.05 ms | 43000.0000 | 8000.0000 | 7000.0000 | 220.82 MB | |
| 41 | +| IndexFiles | 4.8.0-beta00006 | 628.3 ms | 13.19 ms | 19.33 ms | 44000.0000 | 8000.0000 | 7000.0000 | 220.67 MB | |
| 42 | +| IndexFiles | 4.8.0-beta00007 | 617.2 ms | 8.44 ms | 11.83 ms | 44000.0000 | 8000.0000 | 7000.0000 | 220.73 MB | |
| 43 | +| IndexFiles | 4.8.0-beta00008 | 620.6 ms | 5.62 ms | 8.41 ms | 44000.0000 | 8000.0000 | 7000.0000 | 221.06 MB | |
| 44 | +| IndexFiles | 4.8.0-beta00009 | 632.8 ms | 12.57 ms | 18.43 ms | 44000.0000 | 8000.0000 | 7000.0000 | 220.95 MB | |
| 45 | +| IndexFiles | 4.8.0-beta00010 | 862.3 ms | 51.13 ms | 74.95 ms | 44000.0000 | 8000.0000 | 7000.0000 | 221.22 MB | |
| 46 | +| IndexFiles | 4.8.0-beta00011 | 636.5 ms | 11.06 ms | 15.87 ms | 44000.0000 | 8000.0000 | 7000.0000 | 221.09 MB | |
| 47 | +| IndexFiles | 4.8.0-beta00012 | 668.8 ms | 14.78 ms | 21.66 ms | 56000.0000 | 7000.0000 | 6000.0000 | 286.63 MB | |
| 48 | +| IndexFiles | 4.8.0-beta00013 | 626.7 ms | 7.78 ms | 10.91 ms | 43000.0000 | 8000.0000 | 7000.0000 | 219.8 MB | |
| 49 | + |
| 50 | +</details> |
| 51 | + |
| 52 | +#### Search Files |
| 53 | +<details> |
| 54 | + <summary>Click to expand</summary> |
| 55 | + |
| 56 | +``` ini |
| 57 | + |
| 58 | +BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19041.630 (2004/?/20H1) |
| 59 | +Intel Core i7-8850H CPU 2.60GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores |
| 60 | +.NET Core SDK=5.0.100 |
| 61 | + [Host] : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 62 | + 4.8.0-beta00005 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 63 | + 4.8.0-beta00006 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 64 | + 4.8.0-beta00007 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 65 | + 4.8.0-beta00008 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 66 | + 4.8.0-beta00009 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 67 | + 4.8.0-beta00010 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 68 | + 4.8.0-beta00011 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 69 | + 4.8.0-beta00012 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 70 | + 4.8.0-beta00013 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT |
| 71 | + |
| 72 | +IterationCount=15 LaunchCount=2 WarmupCount=10 |
| 73 | + |
| 74 | +``` |
| 75 | +| Method | Job | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |
| 76 | +|------------ |---------------- |---------:|--------:|---------:|-----------:|----------:|------:|----------:| |
| 77 | +| SearchFiles | 4.8.0-beta00005 | 274.8 ms | 7.01 ms | 10.28 ms | 18000.0000 | 1000.0000 | - | 82.12 MB | |
| 78 | +| SearchFiles | 4.8.0-beta00006 | 283.4 ms | 7.78 ms | 11.64 ms | 18000.0000 | 1000.0000 | - | 82.13 MB | |
| 79 | +| SearchFiles | 4.8.0-beta00007 | 291.5 ms | 8.91 ms | 13.33 ms | 18000.0000 | 1000.0000 | - | 81.9 MB | |
| 80 | +| SearchFiles | 4.8.0-beta00008 | 162.3 ms | 5.50 ms | 8.23 ms | 17000.0000 | 1000.0000 | - | 80.13 MB | |
| 81 | +| SearchFiles | 4.8.0-beta00009 | 165.6 ms | 2.61 ms | 3.90 ms | 17000.0000 | - | - | 80.13 MB | |
| 82 | +| SearchFiles | 4.8.0-beta00010 | 159.4 ms | 2.84 ms | 4.17 ms | 17000.0000 | 1000.0000 | - | 79.85 MB | |
| 83 | +| SearchFiles | 4.8.0-beta00011 | 160.8 ms | 1.93 ms | 2.77 ms | 17000.0000 | 1000.0000 | - | 79.85 MB | |
| 84 | +| SearchFiles | 4.8.0-beta00012 | 169.2 ms | 6.48 ms | 9.49 ms | 18000.0000 | 1000.0000 | - | 81.11 MB | |
| 85 | +| SearchFiles | 4.8.0-beta00013 | 161.6 ms | 3.28 ms | 4.80 ms | 14000.0000 | 1000.0000 | - | 65.78 MB | |
| 86 | + |
| 87 | +</details> |
| 88 | + |
| 89 | +## Change Log |
| 90 | + |
| 91 | +### Breaking Changes |
| 92 | +* `Lucene.Net.Search.FieldCache`: Added interface `ICreationPlaceholder` and changed `CreationPlaceholder` class to `CreationPlaceHolder<TValue>`. |
| 93 | + |
| 94 | +### Bugs |
| 95 | +* [#356](https://github.com/apache/lucenenet/pull/356) - `Lucene.Net.Store.NativeFSLockFactory`: Modified options to allow read access on non-Windows operating systems. This caused the copy constructor of `RAMDirectory` to throw "The process cannot access the file 'file path' because it is being used by another process" excpetions. |
| 96 | +* [#296](https://github.com/apache/lucenenet/pull/296) - `Lucene.Net.Util.Automaton.State`: Removed `Equals()` implementation; it was intended to use reference equality as a unique key. This caused random `IndexOperationException`s to occur when using `FuzzyTermsEnum`/`FuzzyQuery`. |
| 97 | +* [#387](https://github.com/apache/lucenenet/pull/387) - Fixed formatting in `ArgumentException` message for all analyzer factories so it will display the dictionary contents |
| 98 | +* [#387](https://github.com/apache/lucenenet/pull/387) - Lucene.Net.Util.ExceptionExtensions.GetSuppressedAsList(): Use `J2N.Collections.Generic.List<T>` so the call to `ToString()` will automatically list the exception messages |
| 99 | +* [#387](https://github.com/apache/lucenenet/pull/387) - `Lucene.Net.TestFramework.Analysis.MockTokenizer`: Pass the `AttributeFactory` argument that is provided as per the documentation comment. Note this bug exists in Lucene 4.8.0, also. |
| 100 | +* [#387](https://github.com/apache/lucenenet/pull/387) - `Lucene.Net.Analysis.Common.Tartarus.Snowball.Among`: Fixed `MethodObject` property to return private field instead of itself |
| 101 | +* [#387](https://github.com/apache/lucenenet/pull/387) - `Lucene.Net.Document.CompressionTools`: Pass the offset and length to the underlying `MemoryStream` |
| 102 | +* [#388](https://github.com/apache/lucenenet/pull/388) - Downgraded minimum required `Microsoft.Extensions.Configuration` version to 2.0.0 on .NET Standard 2.0 and 2.1 |
| 103 | + |
| 104 | +### Improvements |
| 105 | +* Updated code examples on website home page |
| 106 | + 1. Show cross-OS examples of building `Directory` paths |
| 107 | + 2. Demonstrate where to put `using` statements |
| 108 | + 3. Removed LinqPad's `Dump()` method and replaced with `Console.WriteLine()` for clarity |
| 109 | + 4. Fixed syntax error in initialization example of `MultiPhraseQuery` |
| 110 | +* Upgraded NuGet dependency J2N to 2.0.0-beta-0010 |
| 111 | +* Upgraded NuGet dependency ICU4N to 60.1.0-alpha.353 |
| 112 | +* Upgraded NuGet dependency Morfologik.Stemming to 2.1.7-beta-0001 |
| 113 | +* [#344](https://github.com/apache/lucenenet/pull/344) - **PERFORMANCE**: `Lucene.Net.Search.FieldCacheImpl`: Removed unnecessary dictionary lookup |
| 114 | +* [#352](https://github.com/apache/lucenenet/pull/352) - Added Azure DevOps tests for x86 on all platforms |
| 115 | +* [#348](https://github.com/apache/lucenenet/pull/348) - **PERFORMANCE**: Reduced `FieldCacheImpl` casting/boxing |
| 116 | +* [#355](https://github.com/apache/lucenenet/pull/355) - Setup nightly build (https://dev.azure.com/lucene-net/Lucene.NET/_build?definitionId=4) |
| 117 | +* **PERFORMANCE**: `Lucene.Net.Util.Automaton.SortedInt32Set`: Removed unnecessary `IEquatable<T>` implementations and converted `FrozenInt32Set` into a struct. |
| 118 | +* **PERFORMANCE**: `Lucene.Net.Util.Bits`: Removed unnecessary `GetHashCode()` method from `MatchAllBits` and `MatchNoBits` (didn't exist in Lucene) |
| 119 | +* `Lucene.Net.Util.Counter`: Changed Get() to Value property and added implicit operator. |
| 120 | +* [#361](https://github.com/apache/lucenenet/pull/361) - Make `CreateDirectory()` method virtual so that derived classes can provide their own `Directory` implementation, allowing for benchmarking of custom `Directory` providers (e.q LiteDB) |
| 121 | +* [#346](https://github.com/apache/lucenenet/pull/346), [#383](https://github.com/apache/lucenenet/pull/383) - **PERFORMANCE**: Change delegate overloads of `Debugging.Assert()` to use generic parameters and `string.Format()` to reduce allocations. Use `J2N.Text.StringFormatter` to automatically format arrays and collections so the processing of converting it to a string is deferred until an assert fails. |
| 122 | +* [#296](https://github.com/apache/lucenenet/pull/296) - **PERFORMANCE**: `Lucene.Net..Index`: Calling `IndexOptions.CompareTo()` causes boxing. Added new `IndexOptionsComparer` class to be used in codecs instead. |
| 123 | +* [#387](https://github.com/apache/lucenenet/pull/387) - Fixed or Suppressed Code Analysis Rules |
| 124 | + * [CA1012](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1012): Abstract types should not have constructors |
| 125 | + * [CA1052](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1052): Static holder types should be Static or NotInheritable |
| 126 | + * [CA1063](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1063): Implement IDisposable Properly (except for IndexWriter). Partially addresses [#265](https://github.com/apache/lucenenet/pull/265). |
| 127 | + * [CA1507](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1507): Use nameof instead of string ([#366](https://github.com/apache/lucenenet/pull/366)) |
| 128 | + * [CA1802](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1802): Use Literals Where Appropriate |
| 129 | + * [CA1810](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1810): Initialize reference type static fields inline |
| 130 | + * [CA1815](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1815): Override equals and operator equals on value types |
| 131 | + * [CA1819](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1819): Properties should not return arrays |
| 132 | + * [CA1820](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1820): Test for empty strings using string length |
| 133 | + * [CA1822](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1822): Mark members as static |
| 134 | + * [CA1825](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1825): Avoid zero-length array allocations |
| 135 | + * [CA2213](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca2213): Disposable fields should be disposed (except for `IndexWriter` and subclasses which need more work) |
| 136 | + * [IDE0016](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0016): use throw expression ([#368](https://github.com/apache/lucenenet/pull/368)) |
| 137 | + * [IDE0018](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0018): Inline variable declaration |
| 138 | + * [IDE0019](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0019): Use pattern matching to avoid 'is' check followed by a cast |
| 139 | + * [IDE0020](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0020-ide0038): Use pattern matching to avoid 'is' check followed by a cast |
| 140 | + * [IDE0021](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0021): Use block body for constructors |
| 141 | + * [IDE0025](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0025): Use expression body for properties |
| 142 | + * [IDE0027](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0027): Use expression body for accessors |
| 143 | + * [IDE0028](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0028): Use collection initializers |
| 144 | + * [IDE0029](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0029-ide0030): Use coalesce expression |
| 145 | + * [IDE0030](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0029-ide0030): Use coalesce expression (nullable) |
| 146 | + * [IDE0031](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0031): Use null propagation |
| 147 | + * [IDE0034](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0034): Simplify 'default' expression |
| 148 | + * [IDE0038](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0020-ide0038): Use pattern matching to avoid 'is' check followed by a cast |
| 149 | + * [IDE0039](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0039): Use local function |
| 150 | + * [IDE0040](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0040): Add accessibility modifiers |
| 151 | + * [IDE0041](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0041): Use is null check |
| 152 | + * [IDE0049](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0049): Use language keywords instead of framework type names for type references |
| 153 | + * [IDE0051](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0051): Remove unused private member |
| 154 | + * [IDE0052](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0052): Remove unread private member |
| 155 | + * [IDE0059](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0059): Remove unnecessary value assignment |
| 156 | + * [IDE0060](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0060): Remove unused parameter |
| 157 | + * [IDE0063](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0063): Use simple 'using' statement |
| 158 | + * [IDE0071](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0071): Simplify interpolation |
| 159 | + * [IDE1005](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide1005): Use conditional delegate call |
| 160 | + * [IDE1006](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/naming-rules): Naming Styles |
| 161 | +* [#387](https://github.com/apache/lucenenet/pull/387) - Removed dead code/commented code |
| 162 | +* [#387](https://github.com/apache/lucenenet/pull/387) - **PERFORMANCE**: Added aggressive inlining in Codecs and Util namespaces |
| 163 | +* [#387](https://github.com/apache/lucenenet/pull/387) - Simplified reuse logic of `TermsEnum` subclasses |
| 164 | +* [#387](https://github.com/apache/lucenenet/pull/387) - **PERFORMANCE**: `Lucene.Net.Index.DocValuesProducer`: Optimized checks in `AddXXXField()` methods |
| 165 | +* [#387](https://github.com/apache/lucenenet/pull/387) - **PERFORMANCE**: `Lucene.Net.Index`: Changed `FieldInfos`, `FreqProxTermsWriterPerField`, `IndexWriter`, `LogMergePolicy`, `SegmentCoreReaders`, and `SegmentReader` to take advantage of the fact that `TryGetValue()` returns a boolean |
| 166 | +* [#370](https://github.com/apache/lucenenet/pull/370), [#389](https://github.com/apache/lucenenet/pull/389) - Reverted `FieldCacheImpl` delegate capture introduced in [#348](https://github.com/apache/lucenenet/pull/348) |
| 167 | +* [#390](https://github.com/apache/lucenenet/pull/390) - Added tests for .NET 5 |
| 168 | +* [#390](https://github.com/apache/lucenenet/pull/390) - Upgraded to C# LangVersion 9.0 |
| 169 | + |
| 170 | +### New Features |
| 171 | +* [#358](https://github.com/apache/lucenenet/pull/358) - Added Community Links page to website |
| 172 | +* [#359](https://github.com/apache/lucenenet/pull/359) - Added builds mailing list to website |
| 173 | +* [#365](https://github.com/apache/lucenenet/pull/365) - Added "Fork me on GitHub" to website and API docs |
| 174 | +* `Lucene.Net.TestFramework`: Added `Assert.DoesNotThrow()` overloads |
0 commit comments