Lucene Feature Parity
✔ means a direct equivalent is available
◐ means a broadly comparable capability
❌ means no equivalent
Lucene.NET refers to the currently packaged 4.8.0-beta00016 line Lucene (Java) refers to Lucene 10.3.1,
Text Analysis
Analysers
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| Standard analyser | ✔ StandardAnalyser |
✔ | ✔ | Lucene: StandardAnalyzer |
| Whitespace analyser | ✔ WhitespaceAnalyser |
✔ | ✔ | Lucene: WhitespaceAnalyzer |
| Simple analyser | ✔ SimpleAnalyser |
✔ | ✔ | Lucene: SimpleAnalyzer; letter-only and lowercase |
| Keyword analyser | ✔ KeywordAnalyser |
✔ | ✔ | Lucene: KeywordAnalyzer; single-token passthrough |
| Stemmed analyser | ✔ StemmedAnalyser |
◐ | ◐ | Wraps any IStemmer; Lucene composes an Analyzer with stemming filters. |
| Language analyser (per-language pipelines) | ✔ LanguageAnalyser |
✔ | ✔ | Lucene language-specific Analyzer implementations; EN, FR, DE, ES, IT, PT, NL, RU, AR, ZH, JA, KO |
| ICU analyser (ICU tokenisation) | ✔ IcuAnalyser / IcuTokeniser |
✔ | ✔ | Unicode segmenter-backed |
| Custom analyser composition | ✔ Analyser / AnalyserFactory |
✔ | ✔ | |
| Per-field analyser overrides | ✔ IndexWriterConfig.FieldAnalysers |
✔ | ✔ | |
| Token budget / truncation policy | ✔ MaxTokensPerDocument / TokenBudgetPolicy |
❌ | ❌ | Truncates or throws when a document exceeds its index-time token limit. |
| Character-level filters (applied before tokenisation) | ✔ IndexWriterConfig.CharFilters |
✔ | ✔ | Ordered character-filter pipeline before analyser tokenisation. |
| Span-based analysis API | ✔ ISpanTokeniser / ISpanTokenFilter / ISpanTokenSink |
❌ | ❌ | Low-allocation, span-based token processing surface. |
Tokenisers
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| Standard tokeniser | ✔ Tokeniser |
✔ | ✔ | Lucene: StandardTokenizer |
| Whitespace tokeniser | ✔ WhitespaceTokeniser |
✔ | ✔ | Lucene: WhitespaceTokenizer |
| Keyword tokeniser | ✔ KeywordTokeniser |
✔ | ✔ | Lucene: KeywordTokenizer |
| Letter tokeniser | ✔ LetterTokeniser |
✔ | ✔ | Lucene: LetterTokenizer |
| N-gram tokeniser | ✔ NGramTokeniser |
✔ | ✔ | Lucene: NGramTokenizer |
| Edge n-gram tokeniser | ✔ EdgeNGramTokeniser |
✔ | ✔ | Lucene: EdgeNGramTokenizer |
| CJK bigram tokeniser | ✔ CJKBigramTokeniser |
✔ | ✔ | Lucene: CJKBigramTokenizer |
| ICU tokeniser (Unicode segmenter) | ✔ IcuTokeniser / UnicodeTokenisation |
✔ | ✔ | |
| Thai tokeniser | ✔ ThaiTokeniser |
✔ | ✔ | Lucene: ThaiTokenizer |
| UAX29 URL/email tokeniser | ✔ Uax29UrlEmailTokeniser |
✔ | ✔ | Lucene: UAX29URLEmailTokenizer |
| Wikipedia tokeniser | ✔ MediaWikiTokeniser |
✔ | ✔ | Lucene: WikipediaTokenizer |
| Pattern tokeniser | ✔ PatternTokeniser |
✔ | ✔ | Lucene: PatternTokenizer |
| Path-hierarchy tokeniser | ❌ | ✔ | ✔ | Lucene: PathHierarchyTokenizer |
| Classic tokeniser | ❌ | ✔ | ✔ | Lucene: legacy ClassicTokenizer |
Token Filters
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| LowercaseFilter | ✔ LowercaseFilter |
✔ | ✔ | |
| StopFilter | ✔ StopWordFilter |
✔ | ✔ | |
| PorterStemFilter | ✔ PorterStemmerFilter |
✔ | ✔ | |
| AccentFoldingFilter (ASCIIFoldingFilter) | ✔ AccentFoldingFilter |
✔ | ✔ | |
| SynonymGraphFilter | ✔ SynonymGraphFilter + SynonymMap |
✔ | ✔ | |
| LengthFilter | ✔ LengthFilter |
✔ | ✔ | |
| TruncateTokenFilter | ✔ TruncateTokenFilter |
✔ | ✔ | |
| UniqueTokenFilter | ✔ UniqueTokenFilter |
✔ | ✔ | |
| DecimalDigitFilter | ✔ DecimalDigitFilter |
✔ | ✔ | |
| ReverseStringFilter | ✔ ReverseStringFilter |
✔ | ✔ | |
| ElisionFilter | ✔ ElisionFilter |
✔ | ✔ | French elision |
| KeywordMarkerFilter | ✔ KeywordMarkerFilter |
✔ | ✔ | |
| ShingleFilter | ✔ ShingleFilter |
✔ | ✔ | |
| WordDelimiterGraphFilter | ✔ WordDelimiterFilter |
✔ | ✔ | |
| FlattenGraphFilter | ✔ FlattenGraphFilter |
✔ | ✔ | |
| KeepWordFilter | ✔ KeepWordFilter |
✔ | ✔ | |
| LimitTokenCountFilter | ✔ LimitTokenCountFilter |
✔ | ✔ | |
| TypeTokenFilter | ✔ TypeTokenFilter |
✔ | ✔ | |
| HunspellStemFilter | ✔ HunspellStemFilter + HunspellDictionary |
✔ | ✔ | |
| Metaphone phonetic filter | ✔ MetaphoneFilter |
✔ | ✔ | |
| Phonetic alternates (Beider-Morse style) | ✔ PhoneticAlternatesFilter + PhoneticEncoding |
✔ | ✔ | Emits bounded phonetic expansions at same position |
| ClassicFilter | ✔ ClassicFilter |
✔ | ✔ | |
| CachingTokenFilter | ✔ CachingTokenFilter |
✔ | ✔ | |
| CommonGramsFilter | ✔ CommonGramsFilter |
✔ | ✔ | |
| HyphenatedWordsFilter | ✔ HyphenatedWordsFilter |
✔ | ✔ | |
| PatternReplaceFilter | ✔ PatternReplaceFilter |
✔ | ✔ | |
| Generic stem token filter | ✔ StemTokenFilter / SnowballStemmer |
✔ | ✔ | Lucene: SnowballFilter |
| Morfologik dictionary stemmer | ❌ | ✔ | ✔ | Lucene: MorfologikFilter / DictionaryStemmer |
| Normalisation filters (Arabic, German, Hindi, Indic) | ❌ | ✔ | ✔ | Backlog |
Character Filters
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| HTMLStripCharFilter | ✔ HtmlStripCharFilter |
✔ | ✔ | |
| MappingCharFilter | ✔ MappingCharFilter |
✔ | ✔ | |
| PatternReplaceCharFilter | ✔ PatternReplaceCharFilter |
✔ | ✔ |
Stemmers
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| English (Porter / Snowball) | ✔ EnglishStemmer |
✔ | ✔ | |
| Light English (minimal) | ✔ LightEnglishStemmer |
✔ | ✔ | Krovetz-inspired light |
| KStem (English) | ✔ KStemmer + KStemLexicon |
✔ | ✔ | Krovetz stemmer |
| French | ✔ FrenchStemmer |
✔ | ✔ | |
| German | ✔ GermanStemmer |
✔ | ✔ | |
| Spanish | ✔ SpanishStemmer |
✔ | ✔ | |
| Italian | ✔ ItalianStemmer |
✔ | ✔ | |
| Portuguese | ✔ PortugueseStemmer |
✔ | ✔ | |
| Dutch | ✔ DutchStemmer |
✔ | ✔ | |
| Russian | ✔ RussianStemmer |
✔ | ✔ | |
| Arabic | ✔ ArabicStemmer |
✔ | ✔ | |
| Chinese | ❌ | ✔ | ✔ | ChineseStemmer is a no-op compatibility adapter that returns input unchanged. |
| Japanese | ❌ | ✔ | ✔ | JapaneseStemmer is a no-op compatibility adapter that returns input unchanged. |
| Korean | ❌ | ✔ | ✔ | KoreanStemmer is a no-op compatibility adapter that returns input unchanged. |
| Hindi | ❌ | ✔ | ✔ | Backlog |
| Turkish | ❌ | ✔ | ✔ | Backlog |
Field Types / Document Model
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| Document model | ✔ LeanDocument |
✔ | ✔ | |
| TextField | ✔ TextField |
✔ | ✔ | Tokenised; the two-argument constructor stores by default. |
| StringField | ✔ StringField |
✔ | ✔ | Exact match, sorted-set DocValues sidecar |
| NumericField | ✔ NumericField |
✔ | ✔ | BKD-indexed, sorted-numeric DocValues sidecar |
| Int64Field | ✔ Int64Field |
◐ | ✔ | Dedicated signed 64-bit field; Lucene.NET uses its older numeric field APIs. |
| StoredField | ✔ StoredField |
✔ | ✔ | Stored-only, binary DocValues sidecar |
| VectorField | ✔ VectorField |
❌ | ✔ | float[] for HNSW/kNN; Lucene.NET 4.8 has no vector-search API. |
| Byte-vector field | ❌ | ❌ | ✔ | Lucene (Java): KnnByteVectorField. |
| Float and double range fields | ❌ | ❌ | ✔ | Lucene (Java): FloatRange / DoubleRange and their DocValues fields. |
| IP-address field | ❌ | ❌ | ✔ | Lucene (Java): InetAddressPoint. |
| GeoPointField | ✔ GeoPointField |
◐ | ✔ | Lat/lon encoded as long; Lucene.NET provides spatial APIs rather than modern LatLonPoint. |
| BinaryField | ✔ BinaryField |
✔ | ✔ | Arbitrary byte array storage with binary DocValues |
| Field stored vs indexed toggle | ✔ stored: param on field constructors |
✔ | ✔ | |
| Per-field analyser assignment | ✔ IndexWriterConfig.FieldAnalysers |
✔ | ✔ | |
| Attribute-based document mapping | ✔ LeanDocumentMap<T> / [LeanDocument] |
❌ | ❌ | Source-generated, reflection-free typed mapping with compile-time schema validation. |
| JSON-to-document mapping | ✔ JsonDocumentMapper |
❌ | ❌ | Maps JsonElement trees to LeanDocument using prefix-path fields and multi-valued arrays. |
| Term vectors (with offsets) | ✔ StoreTermVectors / TermVectorsWriter |
✔ | ✔ | |
| Per-field index-time boosting | ✔ IField.Boost / field constructor boost: |
✔ | ◐ | Lucene.NET retains Field.Boost; current Java Lucene recommends similarity or DocValues-based alternatives. |
| Term vector positions + payloads | ✔ TermVectorEntry.Positions / TermVectorEntry.Payloads |
✔ | ✔ | Preserved through flush, merge, migration, and reading. |
| Field name constraints | ✔ FieldNameValidator |
❌ | ❌ | Not in Lucene |
Indexing
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
IndexWriter |
✔ IndexWriter |
✔ | ✔ | |
| RAM buffer flush | ✔ RamBufferSizeMB / MaxBufferedDocs |
✔ | ✔ | |
Backpressure (MaxQueuedDocs) |
✔ IndexWriterConfig.MaxQueuedDocs |
❌ | ❌ | Blocks AddDocument when the pending queue is full. |
| Segment backpressure | ✔ IndexWriterConfig.MergeThrottleSegments |
❌ | ❌ | Blocks writes until merges reduce the segment count. |
| Commit / Rollback | ✔ writer.Commit() |
✔ | ✔ | |
| Durable commits (fsync) | ✔ IndexWriterConfig.DurableCommits |
◐ | ◐ | Explicit fsync-before-rename guard with graceful fallback. |
| Atomic document add | ✔ writer.AddDocument() |
✔ | ✔ | |
| Atomic update (delete-then-add) | ✔ writer.UpdateDocument() |
✔ | ✔ | |
| Delete by query | ✔ writer.DeleteDocuments() |
✔ | ✔ | |
| Block-join indexing (nested docs) | ✔ writer.AddDocumentBlock() |
✔ | ✔ | |
| Index sort at write time | ✔ IndexSort / IndexWriterConfig.IndexSort |
❌ | ✔ | Supports numeric and string DocValues field sorts; Lucene.NET 4.8 has no native index sorting. |
| Schema validation | ✔ IndexSchema / SchemaValidationException |
❌ | ❌ | Enforces field types and required fields during AddDocument. |
| Concurrent indexing | ✔ IndexWriter.Concurrent.* |
✔ | ✔ | Multi-threaded doc processing |
| Segment merges (background) | ✔ SegmentMerger |
✔ | ✔ | |
| Tiered merge policy | ✔ TieredMergePolicy |
✔ | ✔ | Count threshold per size tier |
| Async indexing API | ✔ AddDocumentAsync / AddDocumentsAsync |
❌ | ❌ | LeanCorpus-native ValueTask indexing API; Lucene writers are synchronous. |
IAsyncEnumerable bulk ingestion |
✔ AddDocumentsAsync(IAsyncEnumerable<>, batchSize) |
❌ | ❌ | LeanCorpus-native streamed, bounded-batch ingestion. |
| HNSW graph build config | ✔ IndexWriterConfig.HnswBuildConfig / HnswSeed / BuildHnswOnFlush |
❌ | ◐ | Per-index build configuration; Java Lucene exposes comparable construction parameters through vector formats. |
| Vector normalisation at index time | ✔ IndexWriterConfig.NormaliseVectors |
❌ | ❌ | L2-normalises vectors so dot product equals cosine similarity. |
| Soft deletes | ✔ IndexWriter.SoftDeleteDocuments(TermQuery) |
❌ | ✔ | Query form is currently term-query based; Lucene.NET 4.8 predates soft deletes. |
| Sequence numbers / update-by-query | ✔ NextSequenceNumber / TrackSequenceNumbers / UpdateDocuments(Query, LeanDocument) |
◐ | ✔ | Sequence metadata is persisted and merged; update-by-query replaces matching documents atomically. |
AddIndexes (merge from directory) |
✔ IndexWriter.AddIndexes(MMapDirectory) |
✔ | ✔ | |
| Payloads on postings | ✔ StorePayloads / PostingsEnum.GetPayload() |
✔ | ✔ | Written, merged, migrated, and read by the postings codec. |
| Per-field index options | ✔ FieldIndexOptions |
✔ | ✔ | Supports documents, frequencies, positions, and offsets. |
| Per-document index-time boosting | ❌ | ❌ | ❌ | LeanCorpus supports per-field index-time boosts and query-time boosts, not a document-wide index boost. |
| LogByteSizeMergePolicy | ✔ LogByteSizeMergePolicy |
✔ | ✔ | |
| NoMergePolicy | ✔ NoMergePolicy |
✔ | ✔ | |
| TwoPhaseCommit (IndexWriter) | ✔ PrepareCommit() / Commit() / Rollback() |
✔ | ✔ | Prepared commits remain invisible until committed and can be rolled back. |
Query Types
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| TermQuery | ✔ TermQuery |
✔ | ✔ | |
| BooleanQuery | ✔ BooleanQuery |
✔ | ✔ | Must / Should / MustNot |
| PhraseQuery (with slop) | ✔ PhraseQuery |
✔ | ✔ | |
| PrefixQuery | ✔ PrefixQuery |
✔ | ✔ | |
| WildcardQuery | ✔ WildcardQuery |
✔ | ✔ | ? and * |
| FuzzyQuery | ✔ FuzzyQuery |
✔ | ✔ | Levenshtein |
| RangeQuery / TermRangeQuery | ✔ RangeQuery / TermRangeQuery |
✔ | ✔ | |
| NumericRangeQuery (BKD-backed) | ✔ RangeQuery on NumericField |
✔ | ✔ | |
| Int64RangeQuery | ✔ Int64RangeQuery |
◐ | ✔ | Dedicated signed 64-bit inclusive range query. |
| Int64PointInSetQuery | ✔ Int64PointInSetQuery |
◐ | ✔ | Dedicated signed 64-bit point-set query. |
| RegexpQuery | ◐ RegexpQuery |
✔ | ✔ | Enumerates terms through the FST but matches with System.Text.RegularExpressions, rather than Lucene's automaton implementation. |
| ConstantScoreQuery | ✔ ConstantScoreQuery |
✔ | ✔ | |
| DisjunctionMaxQuery | ✔ DisjunctionMaxQuery |
✔ | ✔ | |
| FunctionScoreQuery | ✔ FunctionScoreQuery |
◐ | ✔ | Lucene.NET provides comparable FunctionQuery, ValueSource, and custom-scoring APIs. |
| MoreLikeThisQuery | ✔ MoreLikeThisQuery |
✔ | ✔ | |
| VectorQuery / kNN | ✔ VectorQuery |
❌ | ✔ | Lucene (Java): KnnFloatVectorQuery; Lucene.NET 4.8 has no vector API. |
| SpanNearQuery | ✔ SpanNearQuery |
✔ | ✔ | |
| SpanOrQuery | ✔ SpanOrQuery |
✔ | ✔ | |
| SpanNotQuery | ✔ SpanNotQuery |
✔ | ✔ | |
| SpanTermQuery | ✔ SpanTermQuery |
✔ | ✔ | |
| BlockJoinQuery | ✔ BlockJoinQuery |
✔ | ✔ | Single-level parent/child |
| GeoBoundingBoxQuery | ✔ GeoBoundingBoxQuery |
✔ | ✔ | |
| GeoDistanceQuery | ✔ GeoDistanceQuery |
✔ | ✔ | |
| RrfQuery (Reciprocal Rank Fusion) | ✔ RrfQuery |
❌ | ◐ | Java Lucene 10.3.1 provides result-level fusion through TopDocs.rrf(), not a query type. |
| MultiPhraseQuery | ✔ MultiPhraseQuery |
✔ | ✔ | |
| IntervalsQuery family | ✔ IntervalsQuery |
❌ | ✔ | Lucene (Java): Intervals; Lucene.NET 4.8 has no intervals API. |
| PointInSetQuery | ✔ PointInSetQuery |
✔ | ✔ | |
| MatchAllDocsQuery | ✔ MatchAllDocsQuery |
✔ | ✔ | |
| MatchNoDocsQuery | ✔ MatchNoDocsQuery |
✔ | ✔ | |
| FieldExistsQuery | ✔ FieldExistsQuery |
❌ | ✔ | Lucene (Java): FieldExistsQuery; Lucene.NET 4.8 has no equivalent query. |
| CombinedFieldsQuery (BM25F) | ✔ CombinedFieldsQuery |
❌ | ✔ | Lucene (Java): CombinedFieldsQuery; Lucene.NET 4.8 predates it. |
| TermInSetQuery | ✔ TermInSetQuery |
✔ | ✔ | |
| Multi-level BlockJoinQuery | ❌ | ✔ | ✔ | Backlog |
| ToParentBlockJoinSortField | ❌ | ✔ | ✔ | Backlog |
| Join queries (term-based join) | ❌ | ✔ | ✔ | Backlog |
| Function queries / DoubleValuesSource | ❌ | ◐ | ✔ | Lucene.NET has its older ValueSource function-query surface but not Java Lucene's current DoubleValuesSource API. |
| BoostQuery (wrapper) | ✔ Query.Boost / QueryExtensions.WithBoost() |
✔ | ✔ | LeanCorpus uses a base-query property rather than a wrapper type. |
| TermsQuery / TermInSetQuery (byte-ref variant) | ❌ | ✔ | ✔ | Backlog |
| MonitorQuery / Percolator | ❌ | ✔ | ✔ | Backlog |
| MemoryIndex (single-doc in-memory) | ❌ | ✔ | ✔ | Backlog |
| QueryRescorer | ❌ | ✔ | ✔ | Backlog |
| SearchAfter (pagination) | ❌ | ✔ | ✔ | Backlog |
| Count-only search | ✔ IndexSearcher.Count() / CountCollector |
✔ | ✔ | |
| SpanFirstQuery | ❌ | ✔ | ✔ | Backlog |
| SpanContainingQuery / SpanWithinQuery | ❌ | ✔ | ✔ | Backlog |
| SpanMultiTermQueryWrapper | ❌ | ✔ | ✔ | Backlog |
| SpanFieldMaskingQuery | ❌ | ✔ | ✔ | Backlog |
| Byte-vector kNN | ❌ | ❌ | ✔ | Lucene (Java): KnnByteVectorField / KnnByteVectorQuery. |
| Vector similarity-threshold query | ❌ | ❌ | ✔ | Lucene (Java): FloatVectorSimilarityQuery. |
Query Parsing
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| Lucene classic query parser | ✔ QueryParser |
✔ | ✔ | field:term, phrases, proximity, fuzzy, prefix, boost |
| Programmatic query builder | ✔ BooleanQueryBuilder |
✔ | ✔ | |
| Query extensions / helpers | ✔ QueryExtensions |
✔ | ✔ | |
| Typed LINQ query provider | ✔ LeanQueryable<T> / LeanQueryProvider<T> / LeanExpressionVisitor |
❌ | ❌ | Translates strongly typed LINQ expressions through source-generated document mappings. |
+/- required/excluded syntax |
✔ QueryParser |
✔ | ✔ | |
Range syntax [a TO b] |
✔ QueryParser |
✔ | ✔ | |
Grouping (...) |
✔ QueryParser |
✔ | ✔ | |
Boost ^N |
✔ QueryParser |
✔ | ✔ | |
| Lenient parsing mode | ✔ QueryParser |
✔ | ✔ | |
| Full grammar error positions | ❌ | ✔ | ✔ | Backlog |
| Standard query parser (SQP) | ❌ | ✔ | ✔ | Backlog |
| Analysing query parser | ❌ | ✔ | ✔ | AnalyzingQueryParser analyses prefix, wildcard, range, and fuzzy terms. |
| Complex phrase query parser | ❌ | ✔ | ✔ | ComplexPhraseQueryParser. |
| Surround query parser | ❌ | ✔ | ✔ | SurroundQueryParser supports span-oriented query syntax. |
| XML query parser | ❌ | ✔ | ✔ | CoreParser / XmlQueryParser. |
Scoring / Similarity
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| BM25 | ✔ Bm25Similarity / Bm25Scorer |
✔ | ✔ | Default |
| TF-IDF | ✔ TfIdfSimilarity |
✔ | ✔ | |
| BlockMaxWAND early termination | ✔ BlockMaxWandScorer |
◐ | ◐ | Lucene uses BMWAND internally; LeanCorpus exposes the scorer publicly. |
| Score explanations | ✔ searcher.Explain() |
✔ | ✔ | TermQuery and VectorQuery explanations |
| Field boosting (query-time boost in parser) | ✔ ^boost in query parser |
✔ | ✔ | |
| Pluggable similarity | ✔ ISimilarity |
✔ | ✔ | |
| LMDirichletSimilarity | ✔ DirichletSimilarity |
✔ | ✔ | |
| LMJelinekMercerSimilarity | ✔ LMJelinekMercerSimilarity |
✔ | ✔ | |
| LMAbsoluteDiscountingSimilarity | ✔ LMAbsoluteDiscountingSimilarity |
❌ | ❌ | Not in classic Lucene similarity set. |
| BM25L / BM25+ | ✔ Bm25LSimilarity / Bm25PlusSimilarity |
❌ | ❌ | LeanCorpus extensions to the BM25 family, not built-in Lucene similarities. |
| Augmented TF-IDF | ✔ TfIdfAugmentedSimilarity |
❌ | ❌ | Augmented term-frequency variant. |
| Double-normalisation TF-IDF | ✔ TfIdfDoubleNormSimilarity |
❌ | ❌ | Double-normalisation term-frequency variant. |
| Pivoted TF-IDF | ✔ TfIdfPivotedSimilarity |
◐ | ◐ | Pivoted length normalisation; Lucene can compose related scoring models but has no direct equivalent. |
DocValues
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| NumericDocValues | ✔ NumericDocValues / NumericDocValuesReader |
✔ | ✔ | |
| SortedDocValues | ✔ SortedDocValues / SortedDocValuesReader |
✔ | ✔ | |
| SortedSetDocValues | ✔ SortedSetDocValues / SortedSetDocValuesReader |
✔ | ✔ | |
| SortedNumericDocValues | ✔ SortedNumericDocValues / SortedNumericDocValuesReader |
✔ | ✔ | |
| BinaryDocValues | ✔ BinaryDocValues / BinaryDocValuesReader |
✔ | ✔ | |
| Cross-segment ordinal mapping | ❌ | ✔ | ✔ | Lucene: OrdinalMap for sorted and sorted-set DocValues. |
| Norms | ✔ NormsReader / NormsWriter |
✔ | ✔ | |
| Field lengths | ✔ FieldLengthReader / FieldLengthWriter |
✔ | ✔ | |
| DocValues-backed sort fields | ✔ SortField.Numeric / SortField.String |
✔ | ✔ | Uses DocValues internally |
Storage / Codecs
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| FST term dictionary | ✔ FSTBuilder / FSTReader |
✔ | ✔ | |
| BKD tree (numeric + geo) | ✔ BKDTree / BKDReader |
✔ | ✔ | |
| HNSW vector graph | ✔ HnswGraph / HnswGraphBuilder / HnswWriter / HnswReader |
❌ | ✔ | Lucene.NET 4.8 has no vector-search API. |
| Block postings | ✔ BlockPostingsWriter / PostingsReader / BlockPostingsEnum |
✔ | ✔ | |
| Stored fields | ✔ StoredFieldsWriter / StoredFieldsReader |
✔ | ✔ | |
| Term vectors | ✔ TermVectorsWriter / TermVectorsReader |
✔ | ✔ | |
| Memory-mapped directory | ✔ MMapDirectory |
✔ | ✔ | |
| Atomic file writes | ✔ IndexAtomicFileWriter |
✔ | ✔ | |
| Pluggable stored-field compression | ✔ IFieldCompressionCodec / CompressionCodecRegistry |
◐ | ◐ | Module-initialiser registration; Lucene exposes pluggable Codec and StoredFieldsFormat APIs at codec level. |
| BCL codecs (None, Deflate, Brotli) | ✔ NoneCompressionCodec / DeflateCompressionCodec / BrotliCompressionCodec |
❌ | ❌ | Built-in LeanCorpus stored-field codecs. |
| LZ4 codec (optional package) | ✔ Rowles.LeanCorpus.Compression.LZ4 |
✔ | ✔ | Optional extension package with zero-change registration; Lucene uses LZ4 within its stored-field formats. |
| Snappy codec (optional package) | ✔ Rowles.LeanCorpus.Compression.Snappy |
❌ | ❌ | Optional extension package with zero-change registration. |
| Zstandard codec (optional package) | ✔ Rowles.LeanCorpus.Compression.Zstandard |
❌ | ❌ | Optional extension package with zero-change registration. |
| Compound file (.cfs/.cfe) | ❌ | ✔ | ✔ | Backlog |
| SIMD vector ops (AVX-512) | ✔ SimdIntrinsicsVectorOps |
❌ | ◐ | Hand-written AVX-512 cosine and dot-product paths through .NET intrinsics; Java Lucene has platform-vectorised implementations but not this .NET API. |
| Roaring bitmap | ✔ RoaringBitmap |
❌ | ◐ | Java Lucene exposes RoaringDocIdSet, not the same public bitmap abstraction. |
| Per-field stored-field compression selection | ✔ FieldCompressionPolicy |
❌ | ❌ | Compression policy is selected per stored field; Lucene stored-field compression is selected at codec or segment level. |
| Postings format variants (Direct, BlockTree) | ❌ | ✔ | ✔ | Backlog |
| Chunked stored-field format | ❌ | ✔ | ✔ | Backlog |
| Vector quantisation (Int8 / BBQ) | ✔ IndexWriterConfig.VectorQuantisation / VectorQuantisation.Int8 / VectorQuantisation.BBQ |
❌ | ✔ | Int8 scalar and BBQ binary quantisation are wired through flush, merge, reader, and HNSW search. |
| 4-bit scalar and product quantisation (PQ) | ❌ | ❌ | ✔ | Lucene (Java) vector formats; Backlog. |
| Approximate kNN over filters | ✔ VectorQuery filter and HnswSearchOptions |
❌ | ✔ | Supports pre-filter and post-filter modes; Lucene.NET 4.8 has no vector-search API. |
| NioFSDirectory equivalent | ❌ | ✔ | ✔ | Backlog |
| Read-only directory wrapper | ❌ | ◐ | ◐ | Backlog; Lucene directories can be opened for reading or wrapped, but there is no matching first-class API. |
| Object-store pluggable directory | ❌ | ❌ | ❌ | Backlog; none of the compared libraries includes a built-in object-store directory. |
| Directory abstraction | ✔ LeanDirectory |
✔ | ✔ | Base abstraction for index storage implementations. |
| Codec composition framework | ✔ ICodec<T> / Codec / CodecRegistry |
◐ | ◐ | LeanCorpus CodecKit provides composable binary codecs, framing, checksums, validation, and versioning beyond index-format selection. |
| Codec migration registry | ✔ CodecMigrationRegistry / CodecVersionStep |
❌ | ❌ | Ordered in-process format-version migrations. |
Index Management
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| Near-real-time search | ✔ SearcherManager |
✔ | ✔ | |
| Searcher acquire / release (ref-counted) | ✔ SearcherManager.Acquire() / Release() |
✔ | ✔ | |
| Background refresh loop | ✔ SearcherManager |
✔ | ✔ | |
| Refresh failure tracking | ✔ LastRefreshError / ConsecutiveRefreshFailures |
❌ | ❌ | Structured refresh-error tracking and a failure event. |
| Index deletion policies | ✔ IIndexDeletionPolicy / KeepLatestCommitPolicy / KeepLastNCommitsPolicy |
✔ | ✔ | |
| Snapshot deletion policy | ✔ IndexWriter.AcquireSnapshot() / ReleaseSnapshot() |
✔ | ✔ | |
| Index recovery | ✔ IndexRecovery |
✔ | ✔ | |
| Live docs (deletion bitmap) | ✔ LiveDocs |
✔ | ✔ | |
| Format inspection API | ✔ IndexFormatInspector.Inspect() |
❌ | ❌ | Structured inventory of codec versions, sidecars, and orphan files. |
| Compatibility check API | ✔ IndexCompatibility.Check() |
❌ | ❌ | Programmatic read/write compatibility verdict before opening an index. |
| Compatibility guardrails for open | ✔ IndexWriterConfig.CompatibilityMode / IndexOpenGuard |
❌ | ❌ | Blocks or warns before opening an incompatible index. |
| Codec migration API | ✔ IndexCodecMigrator.Plan() / Migrate() |
❌ | ❌ | Dry-run planning, staged migration, rollback, and abandon without full reindexing. |
| Backup / restore with CRC manifest | ✔ IndexBackup.Backup() / Restore() |
❌ | ❌ | CRC manifest with file roles, lengths, and checksums; Lucene requires snapshot plus file copy. |
| Index validation / checker | ✔ IndexValidator.Check() |
✔ | ✔ | |
| Searcher lease | ✔ SearcherLease |
❌ | ❌ | Ref-counted searcher handle with a configurable refresh interval. |
| Query result cache | ✔ QueryCache |
❌ | ✔ | Thread-safe, generation-keyed LRU cache per SearcherManager; Java Lucene provides LRUQueryCache. |
| MultiReader (N directories as one) | ❌ | ✔ | ✔ | Backlog |
| ReaderManager | ❌ | ✔ | ✔ | Backlog |
| InfoStream (writer diagnostic logging) | ❌ | ✔ | ✔ | Backlog |
| Live field values | ❌ | ✔ | ✔ | Lucene: LiveFieldValues tracks updates not yet visible through a refreshed searcher. |
| TaxonomyReader / TaxonomyWriter | ❌ | ✔ | ✔ | Backlog |
| ForceMerge (optimise) | ✔ IndexWriter.ForceMerge(int maxSegments) |
✔ | ✔ | |
| Incremental backup | ❌ | ◐ | ◐ | Backlog. IndexBackup.Backup() currently copies every manifest file and does not compare a prior manifest or skip unchanged files; Lucene supplies snapshot and replication primitives rather than this direct API. |
Faceting and Aggregations
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| Term facets | ✔ SearchWithFacets() → FacetsCollector |
✔ | ✔ | |
| Numeric aggregations (min, max, sum, avg, count) | ✔ SearchWithAggregations() / NumericAggregator / AggregationRequest |
◐ | ◐ | Lucene exposes value-source and facet aggregation primitives, not the same request API. |
| Histogram aggregation | ✔ AggregationType.Histogram |
❌ | ❌ | Fixed-bucket LeanCorpus aggregation; neither Lucene baseline has a direct histogram aggregation API. |
| Field collapsing / result grouping | ✔ SearchWithCollapse() / CollapseField / CollapseMode |
◐ | ◐ | Single-field deduplication by top score or first occurrence; Lucene grouping is broader but not the same API. |
| Drill-down facets | ❌ | ✔ | ✔ | DrillDownQuery; LeanCorpus currently has no facet-filter query surface. |
| Drill-sideways facets | ❌ | ✔ | ✔ | DrillSideways computes sideways counts alongside drill-down results. |
| Range facets (numeric + date) | ❌ | ✔ | ✔ | Backlog |
| Hierarchical / taxonomy facets | ❌ | ✔ | ✔ | Backlog |
| Date histogram with calendar rounding | ❌ | ❌ | ❌ | Backlog; this is not a built-in Lucene aggregation. |
| Percentile aggregator (HDR / t-digest) | ❌ | ❌ | ❌ | Backlog; this is not a built-in Lucene aggregation. |
| Cardinality aggregator (HyperLogLog) | ❌ | ❌ | ❌ | Backlog; this is not a built-in Lucene aggregation. |
Search Extensions
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| Document classification | ❌ | ✔ | ✔ | Lucene classification modules include k-nearest-neighbour and Naive Bayes classifiers. |
| Diversified top-doc collection | ◐ SearchWithCollapse() |
✔ | ✔ | LeanCorpus can collapse on a field but does not expose Lucene's DiversifiedTopDocsCollector contract. |
| Numeric expression scoring | ❌ | ✔ | ✔ | Lucene Expressions compiles formulae over scores and numeric values; unrelated to LeanCorpus's LINQ query provider. |
Highlighting
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| Standard Highlighter | ✔ Highlighter |
✔ | ✔ | |
| Unified Highlighter | ◐ HybridHighlighter |
✔ | ✔ | LeanCorpus hybrid strategy rather than Lucene's exact UnifiedHighlighter implementation. |
| Postings Highlighter | ✔ PostingsHighlighter |
✔ | ◐ | Java Lucene's current unified highlighting supersedes the older standalone postings highlighter. |
| Fast Vector Highlighter | ◐ TermVectorHighlighter |
✔ | ✔ | Term-vector-based equivalent rather than Lucene's exact FastVectorHighlighter. |
| Offset source selection | ✔ Highlighter, PostingsHighlighter, TermVectorHighlighter, HybridHighlighter |
✔ | ✔ | Select the implementation appropriate to available offsets. |
Suggestions / Spell Check
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| DidYouMean spell checker | ✔ DidYouMeanSuggester / SpellIndex |
✔ | ✔ | |
| Prefix-based suggestion | ◐ IndexSearcher.Suggest() |
✔ | ✔ | Built-in FST completion ranked by global document frequency; comparable to Lucene completion suggesters. |
| Analysing suggester | ❌ | ✔ | ✔ | Backlog |
| Fuzzy suggester | ❌ | ✔ | ✔ | Backlog |
| Context suggester | ❌ | ✔ | ✔ | Backlog |
| FreeTextSuggester | ❌ | ✔ | ✔ | Backlog |
Geo / Spatial
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| Geo bounding box query | ✔ GeoBoundingBoxQuery |
✔ | ✔ | |
| Geo distance query | ✔ GeoDistanceQuery |
✔ | ✔ | |
| Geo encoding utilities | ✔ GeoEncodingUtils |
✔ | ✔ | |
| LatLonPoint (BKD-backed lat/lon) | ◐ GeoPointField + BKDTree |
❌ | ✔ | LeanCorpus provides equivalent point indexing under a different field API; Lucene.NET 4.8 predates LatLonPoint. |
| Lat/lon shape field and queries | ❌ | ❌ | ✔ | Lucene (Java): LatLonShape. |
| Cartesian shapes | ❌ | ❌ | ✔ | Lucene (Java): XYShape. |
| Polygon / line string spatial | ❌ | ◐ | ✔ | Lucene.NET offers comparable Spatial4n strategies rather than Java Lucene's BKD shape API. |
| Recursive prefix tree strategies | ❌ | ✔ | ✔ | Backlog |
| BKD-backed geo shapes | ❌ | ❌ | ✔ | Java Lucene: LatLonShape; Lucene.NET 4.8 predates the BKD shape API. |
| XYPoint (cartesian) | ❌ | ❌ | ✔ | Backlog |
Diagnostics / Observability
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| Metrics collector | ✔ IMetricsCollector / DefaultMetricsCollector / MeterMetricsCollector |
❌ | ❌ | Not in Lucene |
| OpenTelemetry ActivitySource (traces) | ✔ LeanCorpusActivitySource |
❌ | ❌ | ActivitySource spans across indexing, search, migration, and backup. |
| Meter instruments (counters, histograms) | ✔ LeanCorpusMaintenanceMetrics |
❌ | ❌ | First-class Meter instruments across index maintenance. |
| Slow query log | ✔ SlowQueryLog |
❌ | ❌ | Ring buffer of queries exceeding a configurable threshold. |
| Search analytics | ✔ SearchAnalytics |
❌ | ❌ | In-process ring buffer of recent search events. |
| Index size report | ✔ IndexSizeReport / IndexSizeCalculator |
◐ | ◐ | Lucene exposes low-level file and segment information rather than the same report API. |
| Segment stats | ✔ SegmentStats / IndexStats |
◐ | ◐ | Lucene exposes segment metadata and diagnostic tools rather than the same typed report. |
Per-query Resource Controls
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| Per-query timeout | ✔ SearchOptions.Timeout |
✔ | ✔ | Lucene has TimeLimitingCollector |
| Per-query memory budget | ✔ SearchOptions.MaxResultBytes |
❌ | ❌ | Hard cap on intermediate-result bytes. |
| Per-query cancellation | ✔ SearchOptions.CancellationToken |
❌ | ◐ | Cooperative cancellation between segments; Java Lucene has QueryTimeout, not cancellation-token semantics. |
| Partial result flag | ✔ TopDocs.IsPartial |
❌ | ❌ | Signals incomplete results caused by timeout or budget. |
| Streaming segment-by-segment results | ✔ searcher.SearchStreaming() |
❌ | ❌ | Yields ScoreDoc results segment by segment for pipelines. |
| Asynchronous streaming search | ✔ searcher.SearchAsync() |
❌ | ❌ | IAsyncEnumerable<ScoreDoc> with timeout, memory-budget, and cancellation support. |
| Per-segment collector wrapping | ✔ TopNCollectorWrapper |
❌ | ❌ | Not in Lucene |
Utilities / Tools
| Feature | In LeanCorpus | In Lucene.NET | In Lucene (Java) | Notes |
|---|---|---|---|---|
| CLI index tool | ✔ leancorpus-cli.exe |
✔ | ◐ | Lucene.NET provides lucene-cli; Java Lucene provides lower-level command-line tools and Luke. |
CLI check command |
✔ leancorpus-cli.exe check |
◐ | ◐ | Comparable index-checking tools exist, but not this command contract. |
CLI inspect command |
✔ leancorpus-cli.exe inspect |
◐ | ◐ | Luke provides comparable inspection, but not this structured command contract. |
CLI compat command |
✔ leancorpus-cli.exe compat |
❌ | ❌ | LeanCorpus-specific compatibility verdict. |
CLI migrate command |
✔ leancorpus-cli.exe migrate |
❌ | ❌ | LeanCorpus-specific staged codec migration. |
CLI backup / restore commands |
✔ leancorpus-cli.exe backup / restore |
❌ | ❌ | LeanCorpus-specific manifest-backed backup and restore. |
| JSON output from CLI | ✔ --json flag |
❌ | ❌ | Structured JSON output from every CLI command. |
| Desktop index browser (Luke) | ❌ | ✔ | ✔ | No GUI equivalent planned |
| Native AOT compatibility | ✔ AOT-safe core; aot-smoke.ps1 |
❌ | ❌ | Trim-safe core with no dynamic code; Lucene.NET is not AOT-compatible. |
| Source-generated JSON metadata | ✔ System.Text.Json source generation throughout |
❌ | ❌ | Reflection-free LeanCorpus serialisation metadata. |
| Source-generated document mapping | ✔ Rowles.LeanCorpus.SourceGen |
❌ | ❌ | Compile-time attribute-based field-descriptor generation. |