Releases: apache/lucenenet
v4.8.0-beta00017
This release contains many bug fixes, performance improvements, and other housekeeping/cleanup tasks. It is the largest update to Lucene.NET 4.8.0 to date.
J2N 2.1 and ICU4N 60.1.0-alpha.436 have had major updates which will lay the groundwork for supporting System.Memory types in Lucene.NET, but those updates will be included in a later release. However, both libraries have had a significant reduction in the number of heap allocations used across their codebases and those improvements have a direct impact on how Lucene.NET performs.
We are including .NET Core support for Lucene.Net.OpenNLP for the first time using the IKVM
MavenRefernencefeature. The IKVM distribution is quite large and due to disk space limitations of our CI enviornment we had to reference an older version of both IKVM and IKVM.Maven.Sdk. These package references may be upgraded by end users to use a newer version without any risk of breaking changes.
Change Log
Breaking Changes
- Lucene.Net.Util.OfflineSorter: Refactored to base file tracking on FileStream rather than FileInfo, which gives us better control over temp file deletion by specifying the
FileOptions.DeleteOnCloseoption. We also use random access so we don't need to reopen streams over files except in the case of ExternalRefSorter. - Refactored CharArraySet and CharArrayMap (now CharArrayDictionary) (#762)
- Lucene.Net.Analysis.Kuromoji.Token: Changed these methods into properties:
IsKnown()toIsKnown,IsUnknown()toIsUnknown,IsUser()toIsUser. - Added guard clauses for all TokenAttribute members
- Lucene.Net.Index.IndexReader: De-nested IReaderClosedListener and renamed to IReaderDisposedListener.
- Lucene.Net.Index.IndexWriter: Fixed
Dispose()overloads so there is no method signature conflict between the publicDispose(waitForMerges)method and the protectedDispose(disposing)method that can be overridden and called from a finalizer. See #265. - Lucene.Net.Search.FieldCacheRangeFilter<T>: Changed accessibility from protected internal to private protected. This class was not intended to be subclassed by users. (see #677)
- Lucene.Net.Search.Suggest.Fst.ExternalRefSorter: Changed temp path generation to use
FileSupport.CreateTempFile()with named prefix and extension because it more closely matches Lucene and makes the files more easily identifiable. - Lucene.Net.Util.OfflineSorter: Changed
DefaultTempDir()toGetDefaultTempDir(). - Lucene.Net.Analysis.SmartCn.SmartChineseAnalyzer: Changed
GetDefaultStopSet()toDefaultStopSet. MarkedGetDefaultStopSet()obsolete. - Lucene.Net.Analysis.Kuromoji.JapaneseAnalyzer: Changed
GetDefaultStopSet()andGetDefaultStopTags()toDefaultStopSetandDefaultStopTags, respectively. Marked the old methods obsolete. - Fixed ArgumentOutOfRange parameters so the message is passed into the 2nd parameter, not the first (which is for argumentName). Fixes #665. Also addressed potential int overflow issues when checking for "index + length must be <= array length".
- Remove .NET 4.5, .NET 4.5.1, and .NET 4.5.2 support and update website framework versions (#650)
- Lucene.Net.IndexWriter.IEvent: Marked internal (as it was in Java). This interface is only used in non-public contexts by Lucene.
- Remove virtual on methods that are being called from constructors (#670 - see PRs linked to this issue)
- Lucene.Net.Util.PriorityQueue<T>: Replaced
(int, bool)constructor and removed constructor call to virtualGetSentinelObject()method (#820) - Lucene.Net.Util: Added ValuePriorityQueue<T> to utilize stack allocations where possible (#826)
- Use factory classes for DirectoryTaxonomyWriter and DirectoryTaxonomyReader to get configs (#847)
- Replicator no longer attempts to deserialize exception types (#968)
- Rename
IndexWriter.NextMerge()toGetNextMerge()(#990) - Lucene.Net.Search.ReferenceContext<T>: Converted to ref struct and reworked
TestControlledRealTimeReopenThread.TestStraightForwardDemonstration()to verify functionality (#925)
Bug Fixes
- Lucene.Net.Util.OfflineSorter: Added back original tests using FileInfo and fixed bugs that were preventing the original behavior
- Lucene.Net.Tests.Store.TestRAMDirectory: Fixed teardown to retry file deletion if they are locked by another process.
- Aligned disposable patterns (#746)
- Changed TokenAttribute usage from concrete implementation type to interface type to align with Lucene 4.8.0. We were using the concrete type in several places where it shouldn't have been.
- Lucene.Net.Util.OfflineSorter: Fixed the
Sort()andSortPartition()methods so they use thetempDirectoryparameter that is passed through the constructor, as was the case in Lucene. Added a constructor overload to specify the directory as a string (a .NET convention). - Lucene.Net.Analysis.Kuromoji.Util.CSVUtil: Applied SOLR-9413 patch to fix the
QuoteEscape()method and add tests. Fixes #660. - Lucene.Net.Search.Similarities: Statically imported SimilarityBase where appropriate so the Log2 method doesn't have to be qualified (like in Lucene). Fixes #694.
- Fixed a bug where the CharArraySet returned from DefaultStopSet in all analyzers was returning a static writable instance instead of a readonly instance as per the docs.
- Lucene.Net.Tests.Index.TestIndexWriter: Finished port of RandomFailingFieldEnumerable. Fixes #695.
- Lucene.Net.Benchmark.Support.TagSoup.Parser::SetProperty(): Removed duplicate guard clause
- Lucene.Net.Analysis.Cjk.CJKBigramFilter: Changed the value of ALL to set all flags (was 0xff instead of 0xffff). Fixes #657.
- Order of precedence for translation of
Remove()method args in FrenchStemmer.cs (#654) - Fixed Infinite loop in HttpClientBase
- Fixed throw statement in BinaryDictionary
- Fixed use of insecure
Path.GetTempFileNamein ExternalRefSorter (#651) - Lucene.Net.Search.package.md: Corrected link to TooManyClausesException
- Fix AssertionError in JapaneseTokenizer backtrace LUCENE-10059 (#777)
- Lucene.Net.Util.RandomizedContext: Create a separate instance of
Randomizer()for each thread initialized with the same seed. Fixes #843. - TestIndexWriterOnJRECrash: Removed using block to ensure that our original CheckIndex error bubbles up instead of any issue disposing (or double-disposing) the directory.
- Lucene.Net.Documents.DateTools: Convert
DateTimeKind.Unspecifieddates to UTC, otherwise they can produce ArgumentOutOfRangeException. Fixes #772. - Lucene.Net.Store: Fixed several
Dispose()methods so they are safe to be called multiple times (#854) - Lucene.Net.QueryParsers.Classic.QueryParserTokenManager: Removed initialization code that caused writing a BOM to standard out upon creation. (#902)
- Lucene.Net.Search.FieldComparer.TermValComparer: Fixed sorting ambiguity between empty fields and missing fields (#912)
- Fix for DocumentsWriter concurrency (fixes #935, closes #886) (#940)
- Finalizer fix in IndexReader (#951)
- Fix for Lucene.Net.Util.SystemConsole throwing not supported exception in .NET MAUI app running on Android/iOS (#952)
- Fix TermStats.TermText access, add CLI comments and 1 CLI bug fix (#963)
Performance
- Lucene.Net.Support.Arrays::CopyOfRange(): Use the
Copy()method rather than a for loop for a ~10x improvement in performance. - Lucene.Net.Support.Arrays::CopyOf(): Use the
Copy()method rather than a for loop for a ~10x improvement in performance. - Lucene.Net.Support.Arrays::Fill(): Replaced for loop implementation with
Array.Fill()orSpan.Fill<T>()depending on platform. - Lucene.Net.Support.Arrays: Added
Copy()overloads that use the most efficient (known) copy method for the platform and data type based on benchmarks. Replaced all occurrences ofArray.Copy()andBuffer.BlockCopy()withArrays.Copy(). - Lucene.Net.Support.DictionaryExtensions: Reduced dependency on the
Put()method and added documentation to indicate that it doesn't work with non-nullable value types. Also documented thePutAll()method and added guard clause. - Lucene.Net.Analysis.Sinks.DateRecognizerSinkFilter: Prefer
ReadOnlySpan<char>overloads ofDateTime.TryParse()andDateTime.TryParseExact(), when available. - Lucene.Net.Analysis.Util.HTMLStripCharFilter: Refactored to remove YyText property (method) which allocates a string every time it is called. Instead, we pass the underlying arra...
v4.8.0-beta00016
This release contains several important bug fixes and performance enhancements.
Breaking Index Changes
There are 2 breaking changes that may affect some users when reading indexes that were created from version 4.8.0-beta00015 and all prior 4.8.0 beta versions (not including 3.0.3).
- A bug was fixed in the generation of segment file names. This only affects users with more than 10 segments in their index.
Lucene.Net.Documents.DateToolshas been modified to return milliseconds since Unix epoch (that is, since Jan 1, 1970 at 00:00:00 UTC) by default to match Java Lucene. This only affects users who explicitly useLucene.Net.Documents.DateToolsin their application and store the result (in .NET ticks) in their index.
If you are affected by either of the above issues, it is recommended to regenerate your indexes during upgrading. However, if that is not feasible, we have provided the following workarounds.
- If you have a large index with more than 10 segments, see #576 for details on how to enable legacy segment name support.
- If you are storing the result of
Lucene.Net.Documents.DateTools.StringToTime(string)orLucene.Net.Documents.DateTools.Round(long)(along) in your index, you are storing .NET ticks. There are now optional parametersinputRepresentationandoutputRepresentationon these methods to specify whether thelongvalue represents .NET ticks, .NET ticks as milliseconds, or millisenonds since the Unix epoch. To exactly match version 4.8.0-beta00015 and prior (including prior major versions):Lucene.Net.Documents.DateTools.StringToTime(string, NumericRepresentation)should specifyNumericRepresentation.TICKSforoutputRepresentation.Lucene.Net.Documents.DateTools.Round(long, NumericRepresentation, NumericRepresentation)should specifyNumericRepresentation.TICKS_AS_MILLISECONDSforinputRepresentationandNumericRepresentation.TICKSforoutputRepresentation.
.NET Framework Recommendations
It is recommended that all .NET Framework users migrate as soon as possible.
- In cases where
Lucene.Net.Support.WeakDictionary<TKey, TValue>was used in .NET Framework and .NET Standard 2.0 due to missing APIs, but there is now a better solution usingPrism.Core's weak events in combination withConditionalWeakTable<TKey, TValue>, which means memory management is handled entirely by the GC inLucene.Net.Index.IndexReader,Lucene.Net.Search.FieldCacheImpl,Lucene.Net.Search.CachingWrappingFilterandLucene.Net.Facet.Taxonomy.CachedOrdinalsReader. See #613. - All known issues with loss of floating-point precision on .NET Framework x86 have been fixed.
Change Log
Breaking Changes
- #547 -
Lucene.Net.Util.StringHelper.GOOD_FAST_HASH_SEED: converted from a static field to a property and marked obsolete. Added a new propertyGoodFastHashSeed. RemovedSystemPropertiescall to populate the value of the field, since NUnit only allows us to generate a seed per test, and we need a way to inject the seed value for repeatability. - #547 -
Lucene.Net.TestFramework: AddedLuceneSetUpFixtureBuilderclass to load either a subclass or our default instance ofLuceneTestFrameworkInitializer. Also addedLuceneTestCase.SetUpFixtureto control initialization ofLuceneTestFrameworkInitializerso it is only called on setup and teardown for the assembly. AddedInitialize()method toLuceneTestFrameworkInitializerthat must be used when setting factories during testing. - #547 -
Lucene.Net.TestFramework.Util.LuceneTestCase: DeprecatedGetClassType()method and addedTestTypeproperty - #547 -
Lucene.Net.TestFramework.Util.AbstractBeforeAfterRule``: RemovedLuceneTestCaseparameter fromBefore()andAfter()` methods. - #551 - Changed constructors of
Lucene.Net.Util.NumberFormatandLucene.Net.QueryParsers.Flexible.Standard.Config.NumberDateFormatto acceptIFormatProviderrather thanCultureInfoand changedLucene.Net.Util.NumberFormat.Cultureproperty toLucene.Net.Util.NumberFormat.FormatProvider. - #554 -
Lucene.Net.Misc: MadeDocFreqComparerandTotalTermFreqComparerinto static singletons, only accessible by theDefaultproperty. - #428, #429, #570 -
Lucene.Net.Search.FieldComparer: Redesigned implementation to use reference types for numerics (from J2N) to avoid boxing. - #570 -
Lucene.Net.Search.FieldCache.IParser: Renamed method fromTermsEnum()toGetTermsEnum()to match other APIs - #570 -
Lucene.Net.Queries:ObjectVal()returns aJ2N.Numerics.Number-derived type rather than a value type cast to object. Direct casts toint,long,double,single, etc. will no longer work without first casting to theJ2N.Numerics.Number-derived type. Alternatively, use the correspondingConvert.ToXXX()method for the type you wish to retrieve from the object. - #574 -
Lucene.Net.Suggest.Fst.FSTCompletionLookup/WFSTCompletionLookup: ChangedGet()to returnlong?instead ofobjectto eliminate boxing/unboxing - #574 -
Lucene.Net.Index.MergePolicy::FindForcedMerges(): Removed unnecessary nullable fromFindForcedMerges()and allMergePolicysubclasses - #574 -
Lucene.Net.Replicator: Changed callback signature fromFunc<bool?>toAction, since the return value had no semantic meaning - #575 -
Lucene.Net.Index.DocValuesFieldUpdates: Refactored so the subclasses will handle getting the values fromDocValuesFieldUpdatesIteratororDocValuesUpdatevia a cast rather than boxing the value. Also marked internal (as well as all members ofBufferedUpdates), since this was not supposed to be part of the public API. - #573, #576 - Changed segment file names to match Lucene 4.8.0 and Lucene.NET 3.x
- #577 -
Lucene.Net.Index.SegmentInfos: ChangedInfo()method to an indexer (.NET Convention) - #580 -
Lucene.Net.Documents.DateTools- AddedNumericRepresentationenum to allow converting to/from long in the following formats:-
Unix Epoch (default): Milliseconds since Jan 1, 1970 12:00:00 AM UTC.
-
Ticks: The raw ticks from
DateTimeorDateTimeOffset. -
Ticks as Milliseconds: This is for compatibility with prior versions of Lucene.NET (3.0.3 and 4.8.0-beta00001 - 4.8.0-beta00015). The conversion done on input values is
time * TimeSpan.TicksPerMillisecondand the conversion to output values istime / TimeSpan.TicksPerMillisecond.The
longreturn value fromLucene.Net.Documents.DateTools.StringToTime(string, NumericRepresentation)has been changed fromNumericRepresentation.TICKStoNumericRepresentation.UNIX_TIME_MILLISECONDSby default.The
longinput parameter provided toLucene.Net.Documents.DateTools.Round(long, NumericRepresentation, NumericRepresentation)has been changed fromNumericRepresentation.TICKS_AS_MILLISECONDStoNumericRepresentation.UNIX_TIME_MILLISECONDSby default.The
longreturn value fromLucene.Net.Documents.DateTools.Round(long, NumericRepresentation, NumericRepresentation)has changed fromNumericRepresentation.TICKStoNumericRepresentation.UNIX_TIME_MILLISECONDSby default.
-
- #580 -
Lucene.Net.Documents.DateTools- De-nestedResolutionenum and renamedDateResolution. - #580 -
Lucene.Net.QueryParsers.Flexible.Standard: Changed numeric nodes to accept and returnJ2N.Numerics.Number-derived types instead ofobject. - #581 - SWEEP:
Lucene.Net.Util.Fst: Changed API to useJ2N.Numerics.Int64instead oflong?for generic closing type as it was designed to use reference equality comparison. - #581 - SWEEP:
Lucene.Net.Util.Fst: Added class constraints to each generic FST type and reverted to reference equality comparisons. - #581, #279 -
Lucene.Net.Util.Fst.Int32sRefFSTEnum: AddedMoveNext()method and markedNext()method obsolete. This change had already been done to BytesRefFSTEnum, which made them inconsistent. - #583 -
Lucene.Net.QueryParsers.Flexible: Removed unnecessary nullable value types fromConfigurationKeysand configuration setters/getters inStandardQueryParser. AddedAbstractQueryConfig.TryGetValue()method to allow retrieving value types so they can be defaulted properly. - #583 -
Lucene.Net.Queries.Function.ValueSources.EnumFieldSource::ctor()- changedenumIntToStringMapto acceptIDictionary<int, string>instead ofIDictionary<int?, string>(removed unnecessary nullable) - #587 -
Lucene.Net.TestFramework.Store.MockDirectoryWrapper: RenamedAssertNoUnreferencedFilesOnClosetoAssertNoUnreferencedFilesOnDispose - #619 -
Lucene.Net.Spatial: Upgraded to new Spatial4n NuGet package that unifies the types from Spatial4n.Core and Spatial4n.Core.NTS - #619 -
Lucene.Net.Spatial.Prefix.Tree.Cell: Renamedm_outerInstance>m_spatialPrefixTreeand constructor parameterouterInstance>spatialPrefixTree - #619 -
Lucene.Net.Spatial.Prefix.AbstractPrefixTreeFilter.BaseTermsEnumTransverser: renamedm_outerInstance>m_filter, constructor parameterouterInstance>filter - #619 -
Lucene.Net.Spatial.Prefix.AbstractPrefixTreeFilter: De-nestedBaseTermsEnumTraverserclass - #619 -
Lucene.Net.Spatial.Prefix.Tree.GeohashPrefixTree.Factory: de-nested and renamedGeohashPrefixTreeFactory - #619 -
Lucene.Net.Spatial.Prefix.Tree.QuadPrefixTree.Factory: de-nested and renamedQuadPrefixTreeFactory - #619 -
Lucene.Net.Spatial.Prefix.AbstractVisitingPrefixTreeFilter: De-nestedVisitorTemplateclass and changed protected fieldm_prefixGridScanLevelto a public property namedPrefixGridScanLevel. - #619 -
Lucene.Net.Spatial.Query: RenamedUnsupportedSpatialOperation>UnsupportedSpatialOperationExceptionto match .NET conventions
Bugs
v4.8.0-beta00015
This release contains important bug fixes, performance enhancements, concurrency improvements, and improved debugging support (full stack traces, consistent exception types, attributes for debug view, and structurally formattable lists).
Much of the exception handling has been changed so it is recommended to test thoroughly, especially if your application relies on catching exceptions from Lucene.NET for control flow. The full extent of the exception handling changes are not documented here, but can be viewed at https://github.com/apache/lucenenet/pull/476/files.
Known Issues
Lucene.Net.Index.IndexWriter::Dispose(): UsingThread.Interrupt()to shutdown background threads in .NET is problematic becauseSystem.Threading.ThreadInterruptedExceptioncould be thrown on anylockstatement with contention on it. This includeslockstatements on code that we depend on or custom components that are engaged during aCommit()(such as a customDirectoryimplementation). These exceptions may causeCommit()to fail in unexpected ways duringIndexWriter.Dispose(). While this affected all prior releases to a much larger degree, this release provides a partial solution usingUninterruptableMonitor.Enter()to ensure these exceptions are ignored and theThread.Interrupt()state restored, which greatly reduces the chance aCommit()could be broken or a deadlock can occur. This problem will not affect applications that do not callThread.Interrupt()to shut down a thread. It is recommended never to useThread.Interrupt()in conjunction withIndexWriter,ConcurrentMergeScheduler, orControlledRealTimeReopenThread.
Change Log
Breaking Changes
- #455 -
lucene-cli: Changed exit codes to well-defined constants to make testing simpler - #407 - Moved all Document extensions to the
Lucene.Net.Documents.Extensionsnamespace and added tests forDocumentExtensionsinLucene.Net.Tests._J-S,Lucene.Net.Tests.ICUandLucene.Net.Tests.Facet. Added guard clauses and updated documentation of Document extension methods and some related fields. - #474 -
Lucene.Net.TestFramework.Util.TestUtil: Renamed method parameters from abbreviations to whole words to follow .NET API conventions and improved documentation. - #475 -
Lucene.Net.Grouping: Refactored and improvedGroupingSearchSearch API and addedGroupByField()andGroupByFunction()methods. - #479 - Moved
Lucene.Net.Jointypes toLucene.Net.Search.Joinnamespace - Marked public exception constructors that were meant only for testing internal (affects only .NET Framework)
- #446, #476 - Redesigned exception handling to ensure that exception behavior is the same as in Lucene and so we consistently throw the closest .NET equivalent exception across all of the projects.
- #480 - Changed
Cardinality()methods toCardinalityproperty. Added obsoleteCardinality()extension methods to the namespace of each of the pertinent types for backward compatibility.Lucene.Net.Index.RandomAccessOrdsLucene.Net.Util.FixedBitSetLucene.Net.Util.Int64BitSetLucene.Net.Util.OpenBitSetLucene.Net.Util.PForDeltaDocIdSetLucene.Net.Util.WAH8DocIdSet
- #481 -
Lucene.Net.Index.Term: ChangedText()method intoTextproperty. Added an obsoleteText()extension method toLucene.Net.Indexnamespace for backward compatibility. - #482 -
Lucene.Net.BinaryDocValuesField: ChangedfTypestatic field toTYPE(as it was in Lucene) and added obsoletefTypefield for backward compatibility. - #483 - Changed all
GetFilePointer()methods into properties namedPositionto matchFileStream. Types affected:Lucene.Net.Store.IndexInput(and subclasses),Lucene.Net.Store.IndexOutput(and subclasses). Added obsolete extension methods for each type inLucene.Net.Storenamespace for backward compatibility. - #484 -
Lucene.Net.QueryParser: Factored outNLS/IMessage/Messagesupport and changed exceptions to use string messages so end users can elect whether or not to use .NET localization, as is possible with any other .NET exception type. - #484 -
Lucene.Net.QueryParsers.Flexible.Messages: Removed entire namespace, as we have refactored to use .NET localization rather than NLS - #484 -
Lucene.Net.Util: RemovedBundleResourceManagerFactoryandIResourceManagerFactory, as these were only to support NLS. The new approach to localizing messages can be achieved by registeringQueryParserMessages.SetResourceProvider(SomeResource.ResourceManager, SomeOtherResource.ResourceManager)at application startup using anyResourceManagerinstance or designer-generated resource'sResourceManagerproperty. - #497, #507 - Factored out
Lucene.Net.Support.Timein favor ofJ2N.Time. Replaced all calls (exceptLucene.Net.Tests.Search.TestDateFilter) that wereEnvironment.TickCountandTime.CurrentTimeMilliseconds()to useTime.NanoTime() / Time.MillisecondsPerNanosecondfor more accurate results. This may break some concurrent applications that are synchronizing with Lucene.NET components usingEnvironment.TickCount. - #504 -
Lucene.Net.Highlighter.VectorHiglight.ScoreOrderFragmentsBuilder.ScoreComparer: Implemented singleton pattern so the class can only be used via theDefaultproperty. - #502 -
Lucene.Net.QueryParser.Flexible.Core.Nodes.IQueryNode: AddedRemoveChildren()method from Lucene 8.8.1 to fix brokenRemoveFromParent()method behavior (applies patch LUCENE-5805). This requires existingIQueryNodeimplementations to implementRemoveChildren()andTryGetTag(). - #502 -
Lucene.Net.QueryParser.Flexible.Core.Nodes.IQueryNode: AddedTryGetTag()method to simplify looking up a tag by name. - #528 -
Lucene.Net.Analysis.Stempel.Egothor.Stemmer.MultiTrie: Changed protectedm_triesfield fromList<Trie>toIList<Trie> - #528 -
Lucene.Net.Search.BooleanQuery: Changed protectedm_weightsfield fromList<Weight>toIList<Weight> - #528 -
Lucene.Net.Search.DisjunctionMaxQuery: Changed protectedm_weightsfield fromList<Weight>toIList<Weight>
Bugs
- #461 -
Lucene.Net.Grouping.GroupingSearch::GroupByFieldOrFunction<TGroupValue>(): Fixed casting bug ofallGroupsCollector.Groupsby changing the cast toICollectioninstead ofIList. - #453, #455 - lucene-cli: Made
appsettings.jsonfile optional. This was causing a fatalFileNotFoundExceptionafter installing lucene-cli without adding anappsettings.jsonfile. - #464 -
Lucene.Net.Codecs.SimpleText.SimpleTextStoredFieldsWriter+Lucene.Net.Codecs.SimpleText.SimpleTextTermVectorsWriter: FixedAbort()methods to correctly swallow any exceptions thrown byDispose()to match the behavior of Lucene 4.8.0. - #394, #467 -
Lucene.NetNuGet does not compile under Visual Studio 2017. DowngradedLucene.Net.CodeAnalysis.CSharpandLucene.Net.CodeAnalysis.VisualBasicfrom .NET Standard 2.0 to .NET Standard 1.3 to fix. - #471 - Lucene.Net.Documents.FieldType: Corrected documentation to reflect the actual default of
IsTokenaizedastrueandNumericTypeasNumericType.NONE, and to set toNumericType.NONE(rather thannull) if the field has no numeric type. - #476 -
Lucene.Net.Analysis.Common.Util.CharArraySet: ThrowNotSupportedExceptionwhen the set is readonly, notInvalidOperationExceptionto match .NET collection behavior - #476 -
Lucene.Net.Codecs.Bloom.BloomFilteringPostingsFormat::FieldsConsumer(): ThrowNotSupportedExceptionrather thanInvalidOperationException - #476 -
Lucene.Net.Codecs.Lucene42.Lucene42DocValuesProducer::LoadNumeric(): ThrowAssertionErrorrather thanInvalidOperationException - #476 -
Lucene.Net.Store.CompoundFileDirectory::ReadEntries(): throwAssertionErrorrather thanInvalidOperationException - #476 -
Lucene.Net.Util.Packed.DirectPackedReader::Get(): ThrowAssertionErrorrather thanInvalidOperationException - #476 -
Lucene.Net.Facet: ThrowInvalidOperationExceptionrather thanThreadStateException - #476 -
Lucene.Net.Grouping.BlockGroupingCollector: ThrowNotSupportedExceptionrather thanInvalidOperationException - #476 -
Lucene.Net.Tests.Index.TestUniqueTermCount: ThrowNotSupportedExceptionrather thanInvalidOperationException - #486 - Changed all references that were
float.MinValueanddouble.MinValuetofloat.Epsilonanddouble.Epsilonbecause those are the .NET equivalent constants toFloat.MIN_VALUEandDouble.MIN_VALUEin Java - #492, #497 -
Lucene.Net.Search.ControlledRealTimeReopenThread- Fixed time calculation issue that was causing wait to happen for unusually long time periods. Lucene.Net.Tests.Search.TestMultiThreadTermVectors: Removed stray[Test]attribute that was causing extra overhead with no benefit- #509 -
Lucene.Net.Support.WeakDictionary: ChangedWeakKeyto useWeakReference<T>instead ofWeakReferenceto avoid problems with garbage collection - #504 -
Lucene.Net.Highlighter.VectorHiglight.ScoreOrderFragmentsBuilder.ScoreComparer: Implemented singleton pattern so the class can only be used via theDefaultproperty. - #506, #509 -
Lucene.Net.Index.IndexReader: UseConditionalWeakTable<TKey, TValue>/WeakDictionary<TKey, TValue>to ensure dead elements are pruned and garbage collected - #525 - Fixed
Lucene.Net.Index.TestIndexWriter::TestThreadInterruptDeadlock()andLucene.Net.Index.TestIndexWriter::TestTwoThreadsInterruptDeadlock()that were failing due to a difference in .NETThread.Interrupt()behavior. In Java, anInterruptedExceptionis never thown fromsynchronized (this)(the equivalent oflock (this)), but .NET may throw `ThreadInterruptedExcepti...
v4.8.0-beta00014
This release contains bug fixes and minor performance improvements
Known Issues
-
The
lucene-clitool requires anappsettings.jsonfile, but none was shipped. Upon runningluceneon the command line, the following error will be presented:F:\Projects\lucenenet>lucene Unhandled exception. System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\Users\shad\.dotnet\tools\.store\lucene-cli\4.8.0-beta00010\lucene-cli\4.8.0-beta00010\tools\netcoreapp3.1\any\appsettings.json'. at Microsoft.Extensions.Configuration.FileConfigurationProvider.HandleException(ExceptionDispatchInfo info) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load() at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers) at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build() at Lucene.Net.Cli.Program.Main(String[] args) in D:\a\1\s\src\dotnet\tools\lucene-cli\Program.cs:line 27Adding a text file named
appsettings.jsonto the location specified in the error message with opening and closing brackets will prevent the exception.appsettings.json
{ }IMPORTANT: There must be at least opening and closing curly brackets in the file, or it won't be parsed as valid JSON.
Benchmarks (from #310)
Index Files
Click to expand
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19041.867 (2004/?/20H1)
Intel Core i7-8850H CPU 2.60GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores
.NET Core SDK=5.0.104
[Host] : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00005 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00006 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00007 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00008 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00009 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00010 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00011 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00012 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00013 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00014 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
InvocationCount=1 IterationCount=15 LaunchCount=2
UnrollFactor=1 WarmupCount=10
| Method | Job | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated |
|---|---|---|---|---|---|---|---|---|
| IndexFiles | 4.8.0-beta00005 | 905.6 ms | 131.82 ms | 197.30 ms | 43000.0000 | 8000.0000 | 7000.0000 | 220.99 MB |
| IndexFiles | 4.8.0-beta00006 | 707.1 ms | 18.57 ms | 26.04 ms | 44000.0000 | 8000.0000 | 7000.0000 | 220.99 MB |
| IndexFiles | 4.8.0-beta00007 | 712.2 ms | 16.45 ms | 23.06 ms | 44000.0000 | 8000.0000 | 7000.0000 | 221.04 MB |
| IndexFiles | 4.8.0-beta00008 | 785.7 ms | 17.37 ms | 25.46 ms | 44000.0000 | 8000.0000 | 7000.0000 | 221.54 MB |
| IndexFiles | 4.8.0-beta00009 | 824.9 ms | 32.86 ms | 48.17 ms | 44000.0000 | 8000.0000 | 7000.0000 | 221.34 MB |
| IndexFiles | 4.8.0-beta00010 | 789.6 ms | 16.40 ms | 24.04 ms | 44000.0000 | 8000.0000 | 7000.0000 | 221.35 MB |
| IndexFiles | 4.8.0-beta00011 | 805.4 ms | 21.26 ms | 31.82 ms | 44000.0000 | 8000.0000 | 7000.0000 | 221.37 MB |
| IndexFiles | 4.8.0-beta00012 | 827.8 ms | 13.95 ms | 20.89 ms | 56000.0000 | 7000.0000 | 6000.0000 | 287.03 MB |
| IndexFiles | 4.8.0-beta00013 | 793.6 ms | 13.63 ms | 19.55 ms | 44000.0000 | 8000.0000 | 7000.0000 | 220.22 MB |
| IndexFiles | 4.8.0-beta00014 | 812.0 ms | 21.97 ms | 30.79 ms | 44000.0000 | 8000.0000 | 7000.0000 | 220.29 MB |
Search Files
Click to expand
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19041.867 (2004/?/20H1)
Intel Core i7-8850H CPU 2.60GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores
.NET Core SDK=5.0.104
[Host] : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00005 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00006 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00007 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00008 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00009 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00010 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00011 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00012 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00013 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
4.8.0-beta00014 : .NET Core 3.1.13 (CoreCLR 4.700.21.11102, CoreFX 4.700.21.11602), X64 RyuJIT
IterationCount=15 LaunchCount=2 WarmupCount=10
| Method | Job | Mean | Error | StdDev | Median | Gen 0 | Gen 1 | Gen 2 | Allocated |
|---|---|---|---|---|---|---|---|---|---|
| SearchFiles | 4.8.0-beta00005 | 421.1 ms | 111.47 ms | 163.38 ms | 326.3 ms | 18000.0000 | 1000.0000 | - | 82.11 MB |
| SearchFiles | 4.8.0-beta00006 | 349.8 ms | 24.03 ms | 35.97 ms | 338.9 ms | 18000.0000 | 1000.0000 | - | 82.11 MB |
| SearchFiles | 4.8.0-beta00007 | 333.6 ms | 17.36 ms | 25.98 ms | 336.8 ms | 18000.0000 | 1000.0000 | - | 81.9 MB |
| SearchFiles | 4.8.0-beta00008 | 191.7 ms | 7.17 ms | 10.51 ms | 187.9 ms | 17000.0000 | 1000.0000 | - | 80.13 MB |
| SearchFiles | 4.8.0-beta00009 | 186.6 ms | 8.56 ms | 12.55 ms | 184.0 ms | 17000.0000 | 1000.0000 | - | 80.13 MB |
| SearchFiles | 4.8.0-beta00010 | 182.2 ms | 6.69 ms | 9.16 ms | 181.6 ms | 17000.0000 | 1000.0000 | - | 79.85 MB |
| SearchFiles | 4.8.0-beta00011 | 208.9 ms | 17.73 ms | 26.54 ms | 207.9 ms | 17000.0000 | 1000.0000 | - | 79.85 MB |
| SearchFiles | 4.8.0-beta00012 | 192.3 ms | 10.99 ms | 16.46 ms | 187.8 ms | 18000.0000 | 1000.0000 | - | 81.11 MB |
| SearchFiles | 4.8.0-beta00013 | 177.4 ms | 7.74 ms | 11.59 ms | 175.1 ms | 14000.0000 | 1000.0000 | - | 65.78 MB |
| SearchFiles | 4.8.0-beta00014 | 172.7 ms | 5.93 ms | 8.88 ms | 168.9 ms | 14000.0000 | 1000.0000 | - | 65.78 MB |
Change Log
Breaking Changes
- #424 - Deprecated
TaskMergeScheduler, a merge scheduler that was added to support .NET Standard 1.x - #424 -
Lucene.Net.TestFramework: Removed the publicLuceneTestCase.ConcurrentMergeSchedulerFactoriesclass
Bugs
- #405, #415 -
Lucene.Net.Index.DocTermOrds: Fixed issue with enumerator (OrdWrappedTermsEnum) incorrectly returningtruewhen the value isnull. - #427 -
Lucene.Net.Analysis.Common: FixedTestRollingCharBuffer::Test()to prevent out of memory exceptions when running withVerboseenabled - #434, #418 - Hunspell affixes' file parsing corrupts some affixes' conditions
- #434, #419 -
HunspellStemFilterdoes not work with zero affix - #439 -
Lucene.Net.Facet.Taxonomy.CachedOrdinalsReader: Fixed synchronization issue between adding new items to the cache and readingRamBytesUsedmethod - #439, #417, #319 -
Lucene.Net.Spatial.Util.ShapeFieldCacheProvider: Fixed atomicity issue with loading the cache by usingLazy<T>. - #441 -
Lucene.Net.TestFramework.Support.Confguration.TestConfigurationFactory: UseLazy<T>to ensure theconfigurationCache.GetOrAdd()factory is atomic. - #441 -
Lucene.Net.TestFramework.Search.ShardSearchingTestBase: Fixed possibleKeyNotFoundExceptionwhen getting the value fromcollectionStatisticsCache` - #441, #417, #319 -
Lucene.Net.Spatial.Prefix.PrefixTreeFactory: UseLazy<T>inConcurrentDictionaryto make thevalueFactoryatomic. - #443 -
Lucene.Net.Benchmark.ByTask.Feeds.SpatialDocMaker: SinceDictionary<TKey, TValue>.this[key]is not marked virtual in .NET, subclassingDictionary<string, string>is not a valid approach. So we implementIDictionary<string, string>` instead. - #416 - CLI Documentation issue - environment variable token not replaced.
- #450 -
Lucene.Net.Facet- Reverted locking in to the state it was in Lucene 4.8.1, however we are still making use ofReaderWriterLockSlimto improve read performance of caches. Also, removed the 1 second lock timeout fromCl2oTaxonomyWriterCache.
Improvements
- #269 - Added
[AwaitsFix]attribute to known failing tests - #391 - Improved plugins in DocFx when generating API docs
- #392 - Enabled GitHub Actions to Run Tests on Pull Request
- #395 - Improved performance of build pipeline by publishing the whole solution in one step instead of one project at a time
- #395 - Fixed dependency NuGet package version conflicts
- #395 - Added crash and hang detection to the test runs
- #395 - Upgraded to the latest
dotnetCLI commandsdotnet buildanddotnet testrather thandotnet msbuildanddotnet vstest - #41...
v4.8.0-beta00013
This release contains important bug fixes and performance enhancements.
Known Issues
-
The
lucene-clitool requires anappsettings.jsonfile, but none was shipped. Upon runningluceneon the command line, the following error will be presented:F:\Projects\lucenenet>lucene Unhandled exception. System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\Users\shad\.dotnet\tools\.store\lucene-cli\4.8.0-beta00010\lucene-cli\4.8.0-beta00010\tools\netcoreapp3.1\any\appsettings.json'. at Microsoft.Extensions.Configuration.FileConfigurationProvider.HandleException(ExceptionDispatchInfo info) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load() at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers) at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build() at Lucene.Net.Cli.Program.Main(String[] args) in D:\a\1\s\src\dotnet\tools\lucene-cli\Program.cs:line 27Adding a text file named
appsettings.jsonto the location specified in the error message with opening and closing brackets will prevent the exception.appsettings.json
{ }IMPORTANT: There must be at least opening and closing curly brackets in the file, or it won't be parsed as valid JSON.
-
J2N versions prior to version 2.0.0-beta-0012 had an infinite recursion bug on
Xamarin.Androidwhich caused fatal crashes in Lucene.NET. Upgrading J2N to 2.0.0-beta-0012 or higher will prevent these crashes from occurring.
Benchmarks (from #310)
Index Files
Click to expand
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19041.630 (2004/?/20H1)
Intel Core i7-8850H CPU 2.60GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores
.NET Core SDK=5.0.100
[Host] : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00005 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00006 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00007 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00008 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00009 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00010 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00011 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00012 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00013 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
InvocationCount=1 IterationCount=15 LaunchCount=2
UnrollFactor=1 WarmupCount=10
| Method | Job | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated |
|---|---|---|---|---|---|---|---|---|
| IndexFiles | 4.8.0-beta00005 | 628.1 ms | 8.41 ms | 12.05 ms | 43000.0000 | 8000.0000 | 7000.0000 | 220.82 MB |
| IndexFiles | 4.8.0-beta00006 | 628.3 ms | 13.19 ms | 19.33 ms | 44000.0000 | 8000.0000 | 7000.0000 | 220.67 MB |
| IndexFiles | 4.8.0-beta00007 | 617.2 ms | 8.44 ms | 11.83 ms | 44000.0000 | 8000.0000 | 7000.0000 | 220.73 MB |
| IndexFiles | 4.8.0-beta00008 | 620.6 ms | 5.62 ms | 8.41 ms | 44000.0000 | 8000.0000 | 7000.0000 | 221.06 MB |
| IndexFiles | 4.8.0-beta00009 | 632.8 ms | 12.57 ms | 18.43 ms | 44000.0000 | 8000.0000 | 7000.0000 | 220.95 MB |
| IndexFiles | 4.8.0-beta00010 | 862.3 ms | 51.13 ms | 74.95 ms | 44000.0000 | 8000.0000 | 7000.0000 | 221.22 MB |
| IndexFiles | 4.8.0-beta00011 | 636.5 ms | 11.06 ms | 15.87 ms | 44000.0000 | 8000.0000 | 7000.0000 | 221.09 MB |
| IndexFiles | 4.8.0-beta00012 | 668.8 ms | 14.78 ms | 21.66 ms | 56000.0000 | 7000.0000 | 6000.0000 | 286.63 MB |
| IndexFiles | 4.8.0-beta00013 | 626.7 ms | 7.78 ms | 10.91 ms | 43000.0000 | 8000.0000 | 7000.0000 | 219.8 MB |
Search Files
Click to expand
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19041.630 (2004/?/20H1)
Intel Core i7-8850H CPU 2.60GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores
.NET Core SDK=5.0.100
[Host] : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00005 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00006 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00007 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00008 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00009 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00010 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00011 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00012 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
4.8.0-beta00013 : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT
IterationCount=15 LaunchCount=2 WarmupCount=10
| Method | Job | Mean | Error | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated |
|---|---|---|---|---|---|---|---|---|
| SearchFiles | 4.8.0-beta00005 | 274.8 ms | 7.01 ms | 10.28 ms | 18000.0000 | 1000.0000 | - | 82.12 MB |
| SearchFiles | 4.8.0-beta00006 | 283.4 ms | 7.78 ms | 11.64 ms | 18000.0000 | 1000.0000 | - | 82.13 MB |
| SearchFiles | 4.8.0-beta00007 | 291.5 ms | 8.91 ms | 13.33 ms | 18000.0000 | 1000.0000 | - | 81.9 MB |
| SearchFiles | 4.8.0-beta00008 | 162.3 ms | 5.50 ms | 8.23 ms | 17000.0000 | 1000.0000 | - | 80.13 MB |
| SearchFiles | 4.8.0-beta00009 | 165.6 ms | 2.61 ms | 3.90 ms | 17000.0000 | - | - | 80.13 MB |
| SearchFiles | 4.8.0-beta00010 | 159.4 ms | 2.84 ms | 4.17 ms | 17000.0000 | 1000.0000 | - | 79.85 MB |
| SearchFiles | 4.8.0-beta00011 | 160.8 ms | 1.93 ms | 2.77 ms | 17000.0000 | 1000.0000 | - | 79.85 MB |
| SearchFiles | 4.8.0-beta00012 | 169.2 ms | 6.48 ms | 9.49 ms | 18000.0000 | 1000.0000 | - | 81.11 MB |
| SearchFiles | 4.8.0-beta00013 | 161.6 ms | 3.28 ms | 4.80 ms | 14000.0000 | 1000.0000 | - | 65.78 MB |
Change Log
Breaking Changes
Lucene.Net.Search.FieldCache: Added interfaceICreationPlaceholderand changedCreationPlaceholderclass toCreationPlaceHolder<TValue>.
Bugs
- #356 -
Lucene.Net.Store.NativeFSLockFactory: Modified options to allow read access on non-Windows operating systems. This caused the copy constructor ofRAMDirectoryto throw "The process cannot access the file 'file path' because it is being used by another process" excpetions. - #296 -
Lucene.Net.Util.Automaton.State: RemovedEquals()implementation; it was intended to use reference equality as a unique key. This caused randomIndexOperationExceptions to occur when usingFuzzyTermsEnum/FuzzyQuery. - #387 - Fixed formatting in
ArgumentExceptionmessage for all analyzer factories so it will display the dictionary contents - #387 - Lucene.Net.Util.ExceptionExtensions.GetSuppressedAsList(): Use
J2N.Collections.Generic.List<T>so the call toToString()will automatically list the exception messages - #387 -
Lucene.Net.TestFramework.Analysis.MockTokenizer: Pass theAttributeFactoryargument that is provided as per the documentation comment. Note this bug exists in Lucene 4.8.0, also. - #387 -
Lucene.Net.Analysis.Common.Tartarus.Snowball.Among: FixedMethodObjectproperty to return private field instead of itself - #387 -
Lucene.Net.Document.CompressionTools: Pass the offset and length to the underlyingMemoryStream - #388 - Downgraded minimum required
Microsoft.Extensions.Configurationversion to 2.0.0 on .NET Standard 2.0 and 2.1
Improvements
- Updated code examples on website home page
- Show cross-OS examples of building
Directorypaths - Demonstrate where to put
usingstatements - Removed LinqPad's
Dump()method and replaced withConsole.WriteLine()for clarity - Fixed syntax error in initialization example of
MultiPhraseQuery
- Show cross-OS examples of building
- Upgraded NuGet dependency J2N to 2.0.0-beta-0010
- Upgraded NuGet dependency ICU4N to 60.1.0-alpha.353
- Upgraded NuGet dependency Morfologik.Stemming to 2.1.7-beta-0001
- #344 - PERFORMANCE:
Lucene.Net.Search.FieldCacheImpl: Removed unnecessary dictionary lookup - #352 - Added Azure DevOps tests for x86 on all platforms
- #348 - PERFORMANCE: Reduced
FieldCacheImplcasting/boxing - #355 - Setup nightly build (https://dev.azure.com/lucene-net/Lucene.NET/_build?definitionId=4)
- PERFORMANCE:
Lucene.Net.Util.Automaton.SortedInt32Set: Removed unnecessaryIEquatable<T>implementations and convertedFrozenInt32Setinto a struct. - PERFORMANCE:
Lucene.Net.Util.Bits: Removed unnecessaryGetHashCode()method fromMatchAllBitsandMatchNoBits(didn't exist in Lucene) Lucene.Net.Util.Counter: Changed Get() to Value property and added implicit operator.- #361 - Make
CreateDirectory()method virtual so that derived classes can provide their ownDirectoryimplementation, allowing for benchmarking of customDirectoryproviders (e.q LiteDB) - #346, #383 - PERFORMANCE: Change del...
v4.8.0-beta00012
This release contains important bug fixes and performance enhancements.
Known Issues
-
After installation, when upgrading from versions of Lucene.Net 4.8.0-beta00009 or higher may require a restart of all instances of Visual Studio in order to reload the code analysis analyzer.
-
The
lucene-clitool requires anappsettings.jsonfile, but none was shipped. Upon runningluceneon the command line, the following error will be presented:F:\Projects\lucenenet>lucene Unhandled exception. System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\Users\shad\.dotnet\tools\.store\lucene-cli\4.8.0-beta00010\lucene-cli\4.8.0-beta00010\tools\netcoreapp3.1\any\appsettings.json'. at Microsoft.Extensions.Configuration.FileConfigurationProvider.HandleException(ExceptionDispatchInfo info) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load() at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers) at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build() at Lucene.Net.Cli.Program.Main(String[] args) in D:\a\1\s\src\dotnet\tools\lucene-cli\Program.cs:line 27Adding a text file named
appsettings.jsonto the location specified in the error message with opening and closing brackets will prevent the exception.appsettings.json
{ }IMPORTANT: There must be at least opening and closing curly brackets in the file, or it won't be parsed as valid JSON.
-
J2N versions prior to version 2.0.0-beta-0012 had an infinite recursion bug on
Xamarin.Androidwhich caused fatal crashes in Lucene.NET. Upgrading J2N to 2.0.0-beta-0012 or higher will prevent these crashes from occurring.
Change Log
Breaking Changes
Lucene.Net.Facet: RenamedLRUHashMap>LruDictionary. Changed all members to be virtual to allow users to provide their own LRU cache.Lucene.Net.Facet.FacetsConfig: RemovedProcessSSDVFacetFieldsfrom public API (as was done in Lucene), avoid lock (this)Lucene.Net.Facet.TaxonomyReader: ChangedDoClose()toDispose(bool)and implemented proper dispose pattern. Avoid lock (this).Lucene.Net.Facet.WriterCache: RenamedNameInt32CacheLRU>NameIntCacheLru,NameHashInt32CacheLRU>NameHashInt32CacheLru. Refactored to utilize a generic type internally using composition to avoid boxing/unboxing without exposing the generic closing type publicly. Added publicINameInt32CacheLruas a common interface betweenNameIntCacheLruandNameHashInt32CacheLru.Lucene.Net.Facet.Taxonomy.TaxonomyReader: RestructuredChildrenIteratorintoChildrenEnumeratorLucene.Net.Facet.Taxonomy.CategoryPath: ChangedFullPathLengthfrom a method to a propertyLucene.Net.Facet.DrillSideways: ChangedScoreSubDocsAtOncefrom a method to a propertyLucene.Net.Facet: RefactoredOrdAndValueinto a generic struct that can be used in bothTopOrdAndSingleQueueandTopOrdAndInt32Queue. Added Insert method toUtil.PriorityQueue<T>to allow adding value types without reading the previous value for reuse.Lucene.Net.Analysis.Common.Miscellaneous.CapitalizationFilter: Changed default behavior to use invariant culture instead of the current thread's culture to match Lucene, which seems more natural when using filters inside of analyzers. This also fits more in line with how other filters are selected.- #279 -
Lucene.Net.Analysis.Compound.Hyphenation.TernaryTree: RenamedIterator>Enumerator,Keys()>GetEnumerator() - #279 -
Lucene.Net.Benchmarks.ByTask.Feeds.DirContentSource: RenamedIterator>Enumerator
Bugs
- #269 - Removed cast from
NGramTokenAnymousInnerClassHelper::IsTokenChar(int)that was causing surrogate pairs to fail in theTestUTF8FullRange()tests ofNGramTokenizerTestandEdgeNGramTokenizerTest - Fixed potential issue with
ArgumentExceptions being thrown fromchar.ConvertToUtf32(string, int)by reverting back toCodePointAt()method inTestCharTokenizers.TestCrossPlaneNomalization(). Lucene.Net.QueryParser.Surround.Query.ComposedQuery::MakeLuceneSubQueriesField(): Added missing using block on enumerator- #296 - Fixed surrogate pair and culture-sensitivity issues with many analyzers.
Lucene.Net.Analysis.Common: Fixed classes that were originally using invariant culture to do so again. J2N'sCharacterclass default is to use the current culture, which had changed from the priorCharacterclass from Lucene.Net.Support that used invariant culture. FixesTestICUFoldingFilter::TestRandomStrings().- Lucene.Net.ICU: Fixed ThaiWordBreaker to account for surrogate pairs. Also added locking to help with thread safety. Note that the class is still not completely thread-safe, but this patch fixes the behavior.
Lucene.Net.Spatial.Util.ShapeFieldCache: Removed unnecessary array allocationLucene.Net.TestFramework: FixedLineFileDocsto read byte by byte the same way that Lucene does, except using aBufferedStreamto improve performance.Lucene.Net.TestFramework: FixedNightlyAttribute,WeeklyAttribute,AwaitsFixAttribute, andSlowAttributeso they work at the class levelLucene.Net.Analysis.Icu.Segmentation.ICUTokenizer: Corrected call toICU4N.UChar.IsWhiteSpace()rather thanSystem.Char.IsWhiteSpace(), which may return different results.Lucene.Net.TestFramework.Search.SearchEquivalenceTestBase: Fixed exception when usingOpenBitSet.FastGet()instead ofOpenBitSet.Get(), since the size of the bit set is unknown.Lucene.Net.Index.DocumentsWriterFlushControl: Fixed issue due to misbehaving locking on Monitor.TryEnter(), the code was restructured to disallow any thread that doesn't have a lock intoInternalTryCheckoutForFlush()so the threads do note compete for a lock.- #274 -
Lucene.Net.Facet: Fixed null reference exception inDrillSidewaysScorerfrom patch in Lucene 4.10.4 https://issues.apache.org/jira/browse/LUCENE-6001 Lucene.Net.Facet.Taxonomy.WriterCache.Cl2oTaxonomyWriterCache: Fixed locking onDispose()method and made it safe to call dispose multiple times- Reviewed and added asserts that existed in Lucene and were missing in Lucene.NET. Effectively, this meant we were missing several test conditions that have now been put into place.
Lucene.Net.ICU: Added locking toICUTokenizerto only allow a single thread to manipulate theBreakIteratorat a time. This is a temporary fix to get the tests to pass until a solution is found for makingBreakIteratorthreadsafe.- #332 -
Lucene.Net.Replicator: Fixed an issue inIndexInputStreamthat meant the read method could return a number larger than what was passed in for read count or what the buffer could hold, it should instead return the total number of bytes that was read into the buffer, which logically can't be bigger than the buffer it self. Lucene.Net.Tests.Index.TestIndexWithThreads::TestRollbackAndCommitWithThreads(): Must catch and ignoreAssertionException, as was done in LuceneLucene.Net.Search.TopScoreDocCollector: Disabled optimizations on .NET Framework because of float comparison failures on x86 in Release mode. FixesTestSearchAfter::TestQueries(),TestTopDocsMerge::TestSort_1(),TestTopDocsMerge::TestSort_2().Lucene.Net.Sandbox.Queries.SlowFuzzyTermsEnum: Disabled optimizations on .NET Framework because of float comparison failures on x86 in Release mode. FixesTestTokenLengthOpt().Lucene.Net.Search.FuzzyTermsEnum: Disabled optimizations forAccept()method on .NET Framework because of float comparison failures on x86 in Release mode. FixesTestTokenLengthOpt().- Fixed several references to
J2N.BitConversionthat were calling the overload that normalizes NaN when they should have been calling the raw bit conversion instead (as was done in Lucene). - #323 -
Lucene.Net.Configuration: Removed theIConfigurationRootinterface from theConfigurationRootclass when targeting a version ofMicrosoft.Extensions.Configurationless than 2.0. This will allow the end user to upgradeMicrosoft.Extensions.Configurationseamlessly to versions 2.0 or higher. - #286 -
Lucene.Net.CodeAnalysis: Separated CSharp and VisualBasic into different assemblies to prevent cross-language dependency issues when using analyzers
Improvements
- #261 PERFORMANCE - Fixed
FSTTesterto delete while iterating forward instead of using.ElementAt()to iterate in reverse, which takes about 3x longer - #261 PERFORMANCE -
Lucene.Net.Facet.Taxonomy.WriterCache.NameInt32CacheLRU: Changed fromDictionarytoConcurrentDictionaryso we can delete items from the cache while forward iterating through it. - #261 PERFORMANCE -
Lucene.Net.Index.FieldInfos: ChangedBuilder.FieldInfo()method toTryGetFieldInfo()to optimize check for value - Upgraded NuGet dependency J2N to 2.0.0-beta-0009
- Upgraded NuGet dependency ICU4N to 60.1.0-alpha.352
- Upgraded NuGet dependency Morfologik.Stemming to 2.1.6-beta-0007
- #261 PERFORMANCE - Use J2N's
ICollection<T>.ToArray()extension method that usesICollection<T>.CopyTo(), which takes precedence over the LINQIEnumerable<T>.ToArray()extension method. Benchmarks show about a 1/3 increase in performance. - #261 PERFORMANCE -
Lucene.Net.Support.IO.FileSupport::CreateTempFile(): Optimized the check for invalid characters Directory.Build.props: Disabled warnings for features that require .NET Standard 2.1- #261 PERFORMANCE - Eliminated several calls to
FirstOrDefault(),LastOrDefault(),Skip(),First(), andLast() Lucene.Net.Support.ListExtensions: Factored out BinarySearch in favor of implement...
v4.8.0-beta00011
This release contains a critical patch for .NET Framework users that use
Microsoft.Extensions.Configurationhigher than version 1.1.2. See #311 for details.
This release contains impactful performance enhancements.
Known Issues
-
The
lucene-clitool requires anappsettings.jsonfile, but none was shipped. Upon runningluceneon the command line, the following error will be presented:F:\Projects\lucenenet>lucene Unhandled exception. System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\Users\shad\.dotnet\tools\.store\lucene-cli\4.8.0-beta00010\lucene-cli\4.8.0-beta00010\tools\netcoreapp3.1\any\appsettings.json'. at Microsoft.Extensions.Configuration.FileConfigurationProvider.HandleException(ExceptionDispatchInfo info) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load() at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers) at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build() at Lucene.Net.Cli.Program.Main(String[] args) in D:\a\1\s\src\dotnet\tools\lucene-cli\Program.cs:line 27Adding a text file named
appsettings.jsonto the location specified in the error message with opening and closing brackets will prevent the exception.appsettings.json
{ }IMPORTANT: There must be at least opening and closing curly brackets in the file, or it won't be parsed as valid JSON.
-
J2N versions prior to version 2.0.0-beta-0012 had an infinite recursion bug on
Xamarin.Androidwhich caused fatal crashes in Lucene.NET. Upgrading J2N to 2.0.0-beta-0012 or higher will prevent these crashes from occurring.
Change Log
Breaking Changes
- PERFORMANCE:
Lucene.Net.Analysis.Compound: Changed protected m_tokens field fromLinkedList<T>toQueue<T>for better throughput
Bugs
- #311 -
Lucene.Net.Configuration: RemovedIConfigurationBuilderimplementation that prevents .NET Framework users from being able to upgrade to a higher version than 1.1.2.
Improvements
- PERFORMANCE:
Lucene.Net.TestFramework: RevertedBaseTermVectorsFormatTestCaseto use the original 5000 iterations instead of 500. RevertedTestUtil.RandomSimpleString(Random)to default to a maximum string length of 10 instead of 20, which was slowing down several tests. - PERFORMANCE:
Lucene.Net.TestFramework: RefactoredAssertclass to use custom comparisons for all members, since NUnit'sAssertimplementation uses very slow fluent expressions to do comparisons, which are not practical to use inside of tight loops. - PERFORMANCE: Replaced
LinkedList<T> withQueue` where there is a performance advantage - PERFORMANCE: Reduced memory allocations of
CaseInsensitiveComparerby using its singleton static property - PERFORMANCE: Lucene.Net.Util.RamUsageEstimator: Switched back to
System.Collections.Generic.Dictionarybecause indexer of J2N's dictionary is slower - PERFORMANCE:
Lucene.Net.TestFramework.Util.Fst.FSTTester: UseSystem.Collections.Generic.Dictionaryfor better performance - PERFORMANCE: Switched all remaining tests from using
NUnit.Framework.AsserttoLucene.Net.TestFramework.Assert, which are several orders of magnitude faster - PERFORMANCE:
Lucene.Net.Facet: Optimized DirectoryTaxonomyReader by reducing locking, removing unnecessary casts, and usingLazyInitializerfor the taxonomy array initialization - PERFORMANCE:
Lucene.Net.Tests.Analysis.Common: Changed HunspellStemmerTestBaseto use more optimized assert to compare arrays - SWEEP: Consolidated empty array creation code so it is more DRY
- Upgraded to C# LangVersion 8.0
Lucene.Net.Tests.Support.TestApiConsistency: Added regex filter to exclude public fields from the scan
v4.8.0-beta00010
This release contains impactful performance enhancements.
Known Issues
-
The
lucene-clitool requires anappsettings.jsonfile, but none was shipped. Upon runningluceneon the command line, the following error will be presented:F:\Projects\lucenenet>lucene Unhandled exception. System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\Users\shad\.dotnet\tools\.store\lucene-cli\4.8.0-beta00010\lucene-cli\4.8.0-beta00010\tools\netcoreapp3.1\any\appsettings.json'. at Microsoft.Extensions.Configuration.FileConfigurationProvider.HandleException(ExceptionDispatchInfo info) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load() at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers) at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build() at Lucene.Net.Cli.Program.Main(String[] args) in D:\a\1\s\src\dotnet\tools\lucene-cli\Program.cs:line 27Adding a text file named
appsettings.jsonto the location specified in the error message with opening and closing brackets will prevent the exception.appsettings.json
{ }IMPORTANT: There must be at least opening and closing curly brackets in the file, or it won't be parsed as valid JSON.
-
J2N versions prior to version 2.0.0-beta-0012 had an infinite recursion bug on
Xamarin.Androidwhich caused fatal crashes in Lucene.NET. Upgrading J2N to 2.0.0-beta-0012 or higher will prevent these crashes from occurring.
Change Log
Breaking Changes
- PERFORMANCE:
Lucene.Net.Suggest: Narrowed return type ofContextsproperty fromIEnumerable<BytesRef>toICollection<BytesRef>to improve performance for certain operations Lucene.Net.TestFramework.Util.LuceneTestCase: Refactored to correctly load static fields and converted them into static properties. The names were changed to match the conventions of .NET properties.- #261 PERFORMANCE: Changed to use
BitSetinstead ofBitArrayso we don't have to resort to slow extension methods for certain operations
Bugs
Lucene.Net.Support.Collections::ToString(): Fixed overloads to write "null" when the collection passed isnullrather than throw an exception- #267 -
Lucene.Net.Codecs: Fixed testing condition forBaseTermVectorsFormatTestCaseonTermVectorsReadersby throwingInvalidOperationException - #301 - After upgrading NuGet package dependencies for NUnit to 3.12.0, NUnit3TestAdapter to 3.16.1, and Microsoft.NET.Test.Sdk to 16.6.1, several false positives were noted due to invalid try-catch logic in tests
Improvements
- Added missing documentation table of contents links for lucene-cli, Lucene.Net.Demo, Lucene.Net.Queries, Lucene.Net.QueryParser, Lucene.Net.Replicator, Lucene.Net.Sandbox, Lucene.Net.Spatial, and Lucene.Net.Suggest.
- #261 PERFORMANCE: - Removed all calls to
Type.GetTypeInfo()and call properties/methods on theTypeinstance directly. - #261 PERFORMANCE: -
Lucene.Net.Util.AttributeSource: Create built-in attributes directly rather than usingActivator.CreateInstance() - #261 PERFORMANCE: -
Lucene.Net.Util.AttributeSource: Optimized creation of string to identify attribute type based on attribute interface name - #295 PERFORMANCE: -
Lucene.Net.TestFramework: Added overloads ofAssert.AreEqualfor collections where J2N's aggressive mode can be switched off - #295 PERFORMANCE: -
Lucene.Net.TestFramework: Replaced overloads fromNUnit.Framework.CollectionAssertwith optimized implementations using J2N comparers - #295 PERFORMANCE: -
Lucene.Net.TestFramework: Compile expensive string concatenation out of the release build by usingSystem.Diagnostics.Debug.Assert - #295 PERFORMANCE: -
Lucene.Net.Util.Automaton: FixedStateclass to initialize and trim more efficiently.
Fixes the performance ofLucene.Net.Util.Automaton.TestBasicOperations::TestEmptyLanguageConcatenate(). - #295, #261: PERFORMANCE: - Reduced zero length array allocations
- #295, #261: PERFORMANCE: - Reduced zero length collection allocations
- #295, #261: PERFORMANCE: -
Lucene.Net.TestFramework.Search.RandomSimilarityProvider::ToString(): UseStringBuilderfor better efficiency - #295, #261: PERFORMANCE: -
Lucene.Net.TestFramework.Util.LuceneTestCase: Cache codecType and similarityName as strings so they don't have to be regenerated for each test - #295, #261: PERFORMANCE: -
Lucene.Net.TestFramework: UseAssert.IsFalse()rather thanAssert.That() - #295, #261: PERFORMANCE: - Reduced calls to LINQ methods and expressions.
- #295, #261: PERFORMANCE: -
Lucene.Net.Index.Term: Optimized equality checking - #295, #261: PERFORMANCE: -
Lucene.Net.Util(BytesRef+CharsRef): ImplementedIEquatable<T> - #295, #261: PERFORMANCE: -
Lucene.Net.Tests.Index.TestDocumentsWriterDeleteQueue: Updated comparisons to reduce memory allocations - #295, #261: PERFORMANCE: -
Lucene.Net.TestFramework: ChangedConcurrentMergeSchedulerFactories.Valuesto only return theTaskMergeSchedulerrarely, since it is no longer a default setting and is slowing down tests - #295, #261: PERFORMANCE: - Added some aggressive inlining
Lucene.Net.TestFramework: Added overloads ofAssert.Throwsto supply messagesLucene.Net.TestFramework: Use theMicrosoft.Extensions.Configuration.EnvironmentVariablesprovider instead of our custom one.Lucene.Net.Analysis.Tokenizer: Allow enabling "asserts" for testingazure-pipelines.yml: Changed to use pipeline caching instead of build caching for better performanceLucene.Net.Tests(core) - Rearranged how test projects are split so parallel jobs can process them faster- Fixed up leading whitespace to always use spaces instead of tabs
- Updated NuGet package dependency for J2N to 2.0.0-beta-0008
Lucene.Net.Tests.Analysis.Phonetic.Language.Bm.PhoneticEnginePeformanceTest::Test(): Changed to useStopwatchfor more accurate timingLucene.Net.Tests: Changed private/internal member variables to consistently use camelCase instead of PascalCase- SWEEP: Changed all properties to use expression style syntax, reordered to put get before set, and changed all backing field names back to their original without the "_Renamed" suffix
- SWEEP: Removed fully-qualified exceptions and added using directives instead
- PERFORMANCE: Pre-compile and statically cache regular expressions
- PERFORMANCE:
Lucene.Net.Analysis: Removed unnecessary allocations caused by callingToString()rather than passing theICharTermAttributedirectly - PERFORMANCE:
Lucene.Net.Analysis.Common: Slight optimization ofToUpperandToLowermethods, which are used in several analyzers - SWEEP: Removed .NET Standard 1.x/.NET Core 1.x support from all project files
- SWEEP: Removed unused dependencies for .NET Framework
- PERFORMANCE:
Lucene.Net.Codecs.SimpleText: Usingdecimalis 30% faster than usingBigIntegerfor addition and subtraction - PERFORMANCE: Applied
SlowandNightlyattributes where applicable for better testing performance Lucene.Net.TestFramework: Added logging of system properties to the output of tests- PERFORMANCE:
Lucene.Net.Util.ArrayUtil::GetNaturalComparer<T>(): Use statically cached singleton instance of comparer - Upgraded NuGet dependency ICU4N to 60.1.0-alpha.351
New Features
Lucene.Net.TestFramework.RandomExtensions: Added missing overload ofNextInt64(long)to choose only max upper bound- Added a global Lucene.Net.Diagnostics.Debugging.AssertsEnabled static property that can be used to toggle "asserts" on and off in the release build, similar to how it works in Java. The setting can be injected by end users with the "assert" system property (which is a boolean).
Lucene.Net.TestFramework: Completed implementation ofNightly,Weekly,AwaitsFixandSlowattributes
v4.8.0-beta00009
Known Issues
-
The
lucene-clitool requires anappsettings.jsonfile, but none was shipped. Upon runningluceneon the command line, the following error will be presented:F:\Projects\lucenenet>lucene Unhandled exception. System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\Users\shad\.dotnet\tools\.store\lucene-cli\4.8.0-beta00010\lucene-cli\4.8.0-beta00010\tools\netcoreapp3.1\any\appsettings.json'. at Microsoft.Extensions.Configuration.FileConfigurationProvider.HandleException(ExceptionDispatchInfo info) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load() at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers) at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build() at Lucene.Net.Cli.Program.Main(String[] args) in D:\a\1\s\src\dotnet\tools\lucene-cli\Program.cs:line 27Adding a text file named
appsettings.jsonto the location specified in the error message with opening and closing brackets will prevent the exception.appsettings.json
{ }IMPORTANT: There must be at least opening and closing curly brackets in the file, or it won't be parsed as valid JSON.
-
J2N versions prior to version 2.0.0-beta-0012 had an infinite recursion bug on
Xamarin.Androidwhich caused fatal crashes in Lucene.NET. Upgrading J2N to 2.0.0-beta-0012 or higher will prevent these crashes from occurring.
Change Log
Bugs
- #294 - Fixed the description for Lucene.NET 2.9.4 in the API documentation.
Improvements
- #260 - Changed culture-sensitivity of function-based queries to use the invariant culture when parsing/formatting values, to match the Lucene implementation.
- #266 - Added documentation to show example usage of injecting custom codecs, doc values formats, and postings formats with pure DI or using a dependency injection container. An demo project named Lucene.Net.Tests.TestFramework.DependencyInjection has also been provided as an example of using
Microsoft.Extensions.DependencyInjectionto provide custom codecs to the test environment so they can be used during testing of other components. - #295 - PERFORMANCE Fixed boxing issue with NUnit asserts when passing common primitive types. This significantly improves the performance of running tests.
- Upgraded to ICU4N 60.1.0-alpha.350 and refactored the collation features of
Lucene.Net.ICUto utilize the newUCultureInfoclass. - #282 - Restructured API documentation so each assembly has its own "mini-site" to fix x-ref linking issue, which fixes the TOC and breadcrumbs.
- #282 - Documented the docs and website building procedures.
- #282 - Fixed links on the download page and added missing packages (https://lucenenet.apache.org/download/version-4.8.0-beta00009.html).
New Features
- #254 - Implementation of "System Properties" which allow users to supply configuration values to the test framework and lucene-cli using configuration files or environment variables.
v4.8.0-beta00008
This release contains performance improvements and bug fixes.
The
Lucene.Net.Supportnamespace has been phased out, and most of the components that previously existed there have been refactored and moved to J2N, a library to fill in gaps in functionality between the JDK and .NET.
Known Issues
- J2N versions prior to version 2.0.0-beta-0012 had an infinite recursion bug on
Xamarin.Androidwhich caused fatal crashes in Lucene.NET. Upgrading J2N to 2.0.0-beta-0012 or higher will prevent these crashes from occurring.
Change Log
Breaking Changes
-
#239 - Changed
Append()overloads ofOpenStringBuilderto use startIndex/count rather than start/end to match the .NET convention -
#241 - Made public fields into properties in
ArabicStemmer -
Lucene.Net.Collections: Factored out unmodifiable methods and related classes in favor of J2N'sAsReadOnly()extension methods -
SWEEP:
Lucene.Net.Support: Factored outEquatable,EquatableList, andEquatableSet, and replaced with collections from J2N -
SWEEP:
Lucene.Net.Support: Factored outCollections.Equals()andCollections.GetHashCode() -
Lucene.Net.Support.Collections: Factored outSwap()andShuffle()in favor of J2N's implementation -
Lucene.Net.Support: Factored outIdentityComparer,IdentityHashMap, andIdentityHashSetand usedJ2N.Runtime.CompilerServices.IdentityEqualityComparerin conjunction with standardDictionaryandHashSettypes -
Factored out
TreeSetandTreeDictionaryfromLucene.Net.Supportin favor ofJ2N.Collections.Generic.SortedSetandJ2N.Collections.Generic.SortedDictionary -
Lucene.Net.Support.PriorityQueue: Factored out in favor of J2N's implementation -
Lucene.Net.Support: RefactoredConcurrentHashSetintoConcurrentSet- a wrapper class that can be used to synchronize any set object (ordered or not), similar to how it was done in Java. Changed ordered concurrent set types back to the original type from Lucene. -
Lucene.Net.Search.FieldComparer: ReplacedCompareTo()calls withJCG.Comparer<T>.Default.Compare(), factoring outLucene.Net.Support.SignedZeroComparerin the process. -
Factored out
Character,ICharSequence,StringBuilderCharSequenceWrapper,StringBuilderExtensions,StringCharSequenceWrapper, and mostStringExtensionsmethods in favor of J2N's implementation -
Changed semantics of
CharTermAttribute.Append()overloads to act more like the .NETStringBuilderclass.- The 3rd parameter was changed from an exclusive end index to a count.
- A
nullparameter on a single parameter overload will be a no-op instead of appending the text "null".
- A
nullparameter on a 3 parameter overload will be a no-op if bothstartIndexandcountare 0, otherwise it will throw anArgumentNullException.
-
Lucene.Net.Support: Factored outGeneralKeyedCollectionandAttributeItemin favor ofJ2N.Collections.Generic.LinkedDictionary -
SWEEP: Upgraded to account for breaking changes (
AsCharSequence()andBitOperation) in J2N. -
Lucene.Net.Support.Collections: Factored outImplementsGenericInterface()in favor of J2N's implementation -
Lucene.Net.Support.Collections: Factored outSingleton()method and used collection initializers instead -
Lucene.Net.Support.Collections: RemovedNewSetFromMapmethod and relatedSetFromMapclass -
Lucene.Net.Support: AddedConcurrentHashSetclass for internal use, and factored out the useConcurrentSetthroughout the project -
Removed
Lucene.Net.Support.ConcurrentHashMapWrapperfrom the public API and renamedConcurrentDictionary -
Marked
ExceptionToClassNameConventionAttribute,ExceptionToNetNumericConventionAttribute,ExceptionToNullableEnumConventionAttribute, andWritableArrayAttributeinternal -
Factored out
StringExtensions -
Factored out
DictionaryExtensions -
Factored out
LurchTablein favor of J2N's implementation -
Lucene.Net.Support.Threading: DeletedThreadLock,DisposableThreadLocalProfiler -
Factored out
Lucene.Net.Support.AssemblyExtensionsin favor of J2N's implementation -
Lucene.Net.Support: Marked all types internal -
Moved
Lucene.Net.Support.SystemConsoletoLucene.Net.Utilnamespace -
Lucene.Net.Support: Moved ExceptionExtensions toLucene.Net.Utilnamespace -
Lucene.Net.Support.ListExtensions: MovedAddRange,Sort,TimSort, andIntroSortextension methods toLucene.Net.Util.ListExtensions. -
Lucene.Net.Support.NumberFormat: Moved toLucene.Net.Utilnamespace -
Lucene.Net.TestFramework.Support.JavaCompatibility.AbstractBeforeAfterRule: Moved fromLucene.Net.Supportnamespace toLucene.Net.Util -
Lucene.Net.TestFramework.Support: Changed namespace ofApiScanTestBase,CultureInfoSupport, andExceptionSerializationTestBasetoLucene.Net.Util -
Lucene.Net.Util.NumberFormat,Lucene.Net.QueryParsers.Flexible.Standard.Config.NumberDateFormat: Changed protected locale field to private, made property namedCulture, and changed constructors and methods to use "culture" rather than "locale" for parameter names -
Lucene.Net.Support: MovedSystemPropertiesclass toLucene.Net.Utilnamespace -
Lucene.Net.Benchmark.Support: MovedEnglishNumberFormatExtensionstoLucene.Net.Utilnamespace
Bugs
- #237 - Fix duplicate
FragNumvalue onHighlight.TextFragment - #235 - Fixed broken links on API documentation home page
Lucene.Net.Search.BooleanClause::Equals(BooleanClause): Fixed potential null reference exception whenQueryis set to null- LUCENENET-645 - Added missing call to
FileStream::Flush()inFSIndexOutput::Flush()that was preventing persistence to disk from occuring at the necessary phase - SWEEP: Pass Random instance to all
Shuffle()method calls to ensure the same psuedo-random sequence is used based on the seed Lucene.Net.Index.DocumentsWriterDeleteQueue::DeleteSlice(): Removed extraDebug.Assert()statement that wasn't in Lucene which causedLucene.Net.Index.TestIndexWriterUnicode::TestEmbeddedFFFF()test to fail when running in debug mode
Improvements
- #234 - Moved markdown converter to the
src/docsfolder - #235 - Updated API documentation so each release exists on its own URL
- #235 - Updated documentation converter to be more robust when dealing with namespace matching
- #239 - Replaced all private
IComparer<T>implementations with the built in .NETComparer.Create()factory method - #240 - Implemented
IAppendableonOpenStringBuilder - PERFORMANCE - Removed unnecessary memory copy operations from various
IndexReaderdependencies - LUCENENET-640 - PERFORMANCE - Factored out
WeakIdentityMapin favor of .NET'sConditionalWeakTable - SWEEP: Factored out LinkedHashMap in favor of J2N's LinkedDictionary
- Lucene.Net.Tests.Search.TestFieldCache::Test(): Simplified expression with LINQ query
Lucene.Net.Highlighter,Lucene.Net.Tests.Spatial: Swapped inLinkedHashSetfrom J2N, like in the original Lucene implementation- SWEEP: Factored out
Lucene.Net.Support.HashMapin favor ofJ2N.Collections.Generic.Dictionary - SWEEP: Factored out
System.Collections.Generic.SortedDictionaryin favor ofJ2N.Collections.Generic.SortedDictionary Lucene.Net.Analysis.Kuromoji.Dict.UserDictionary: Swapped out C5TreeDictionaryforJ2N.Collections.Generic.SortedDictionary- SWEEP: Changed
System.Collections.Generic.SortedSettoJ2N.Collections.Generic.SortedSet - SWEEP: Factored out C5's
TreeSet - SWEEP: Swapped out
System.Collections.Generic.HashSetforJ2N.Collections.Generic.HashSet - SWEEP: Factored out
Arrays.AsList(), which was causing both additional operational complexity and unnecessary memory allocations Lucene.Net.Util.Automaton.State: ImplementedIEquatable<State>, changed enumerator to a struct- Removed
FEATURE_HASHSET_CAPACITY, since J2N now has the full .NET Core 3.x implementation with a capacity constructor Lucene.Net.Util.Fst.ListOfOutputs::Merge(): Streamlined so we don't have so many castsLucene.Net.Util.Fst: UseJ2N.Collections.List<T>for the closing type ofOutputs<T>to ensure the outputs can be compared for structural equalityLucene.Net.TestFramework.Search.AssertingScorer: Changed to useConditionalWeakTable/WeakDictionary- LUCENENET-610, LUCENENET-640 - Reduced locking in
FieldCacheand its dependent classes - Added cross-framework compatibility for nullable attributes
- Changed project files to automatically generate
InternalsVisibleToattributes based onItemGroup/InternalsVisibleToelements Lucene.Net.Support.DictionaryExtensions: OptimizedPut()method, added guard clauses toPutandPutAllLucene.Net.Support.DictionaryExtensions: Factored outLoad()andStore()methods in favor of J2N's implementation- LUCENENET-642 -
Lucene.Net.Analysis.TokenStream: Removed Reflection code that is used to force the end user to makeTokenStreamsubclasses or theirIncrementToken()method sealed - LUCENENET-643 - PERFORMANCE -
Lucene.Net.Support.IO.FileStreamExtensions::Read(): Moved toStreamExtensionsclass and optimized to read bytes in bulk instead of one byte at a time Lucene.Net.Tests.Index(TestBagOfPositions+TestBagOfPostings): Fixed performance issue due to convertinginttostringandstringto `...