Skip to content

v3.10.0

Choose a tag to compare

@Shazwazza Shazwazza released this 17 Aug 16:55
· 9 commits to support/3.x since this release
d6258d0

This one's mostly a performance release, plus a Lucene.NET bump.

Lucene.NET 4.8.0-beta00018

The headline change. Examine now runs on the latest Lucene.NET beta (#523) - Lucene.Net.QueryParser and Lucene.Net.Replicator are both bumped from beta00017 to beta00018. If you're pinning Lucene.NET versions yourself, you'll want to update to match.

Performance

Most of the rest of this release came out of agentic workflows running on a schedule, hunting for allocations and wasted work in the hot paths. Nothing here changes behavior - it's all the same results, just cheaper to get:

  • Query building - removed LINQ state-machine allocations from GroupedAnd/Or/Not in both the fluent and Lucene query builders (#515, #518), added a single-field range query overload so Field<T> stops allocating a string[1] (#531), lazy-init the sort field list so unsorted queries don't allocate one (#536), cached the category filter query (#537), and replaced reflection with pattern matching for NumericRangeQuery (#517).
  • Indexing - cached the default field-type factories in the AddDocument loop (#522, #516), used StringComparison.Ordinal in the AddDocument hot path (#521), dropped a redundant ToLower in GenerateHash and cut allocations in RemoveStopWords (#519), and removed LINQ allocations from the ValueSet constructors (#541).
  • Searching - cached the FullText factory and the sortable field names (#520, #533), cached the searcher array in MultiIndexSearcher so it stops running LINQ per search (#529), removed the Lazy<T> and inner closure per SearchResult (#532), killed a closure allocation in FieldValueTypeCollection.GetValueType (#527), and tidied up SearchContext.SearchableFields and ReadOnlyFieldDefinitionCollection (#545, #546).
  • Dead code - removed unused internal string extensions (#534) and a dead Values fallback in SearchResult.GetValues (#526).

Benchmarks and housekeeping

New benchmarks for the managed query and typed Field<T> hot paths (#524, #535), the #487 benchmark results are now published in the QueryBuilder/ValueSetCtor class comments (#525), an agentic workflow update (#558), and a dependabot bump for the docs site (#552).

Full Changelog: v3.9.0...v3.10.0