Lucene Change Log
For more information on past and future Lucene versions, please see:
http://s.apache.org/luceneversions
======================= Lucene 5.0.0 =======================
New Features
* LUCENE-5945: All file handling converted to NIO.2 apis. (Robert Muir)
* LUCENE-5946: SimpleFSDirectory now uses Files.newByteChannel, for
portability with custom FileSystemProviders. If you want the old
non-interruptible behavior of RandomAccessFile, use RAFDirectory
in the misc/ module. (Uwe Schindler, Robert Muir)
* SOLR-3359: Added analyzer attribute/property to SynonymFilterFactory.
(Ryo Onodera via Koji Sekiguchi)
* LUCENE-5648: Index and search date ranges, particularly multi-valued ones. It's
implemented in the spatial module as DateRangePrefixTree used with
NumberRangePrefixTreeStrategy. (David Smiley)
* LUCENE-5895: Lucene now stores a unique id per-segment and per-commit to aid
in accurate replication of index files (Robert Muir, Mike McCandless)
* LUCENE-5889: Add commit method to AnalyzingInfixSuggester, and allow just using .add
to build up the suggester. (Varun Thacker via Mike McCandless)
* LUCENE-5123: Add a "pull" option to the postings writing API, so
that a PostingsFormat now receives a Fields instance and it is
responsible for iterating through all fields, terms, documents and
positions. (Robert Muir, Mike McCandless)
* LUCENE-5268: Full cutover of all postings formats to the "pull"
FieldsConsumer API, removing PushFieldsConsumer. Added new
PushPostingsWriterBase for single-pass push of docs/positions to the
postings format. (Mike McCandless)
* LUCENE-5906: Use Files.delete everywhere instead of File.delete, so that
when things go wrong, you get a real exception message why.
(Uwe Schindler, Robert Muir)
* LUCENE-5933: Added FilterSpans for easier wrapping of Spans instance. (Shai Erera)
* LUCENE-5925: Remove fallback logic from opening commits, instead use
Directory.renameFile so that in-progress commits are never visible.
(Robert Muir)
* LUCENE-5820: SuggestStopFilter should have a factory.
(Varun Thacker via Steve Rowe)
* LUCENE-5949: Add Accountable.getChildResources(). (Robert Muir)
* SOLR-5986: Added ExitableDirectoryReader that extends FilterDirectoryReader and enables
exiting requests that take too long to enumerate over terms. (Anshum Gupta, Steve Rowe,
Robert Muir)
* LUCENE-5911: Add MemoryIndex.freeze() to allow thread-safe searching over a
MemoryIndex. (Alan Woodward, David Smiley, Robert Muir)
* LUCENE-5969: Lucene 5.0 has a new index format with mismatched file detection,
improved exception handling, and indirect norms encoding for sparse fields.
(Mike McCandless, Ryan Ernst, Robert Muir)
* LUCENE-6053: Add Serbian analyzer. (Nikola Smolenski via Robert Muir, Mike McCandless)
* LUCENE-4400: Add support for new NYSIIS Apache commons phonetic
codec (Thomas Neidhart via Mike McCandless)
* LUCENE-6059: Add Daitch-Mokotoff Soundex phonetic Apache commons
phonetic codec, and upgrade to Apache commons codec 1.10. (Thomas
Neidhart via Mike McCandless)
* LUCENE-6058: With the upgrade to Apache commons codec 1.10, the
experimental BeiderMorseFilter has changed its behavior, so any
index using it will need to be rebuilt. (Thomas
Neidhart via Mike McCandless)
* LUCENE-6050: Accept MUST and MUST_NOT (in addition to SHOULD) for
each context passed to Analyzing/BlendedInfixSuggester (Arcadius
Ahouansou, jane chang via Mike McCandless)
* LUCENE-5929: Also extract terms to highlight from block join
queries. (Julie Tibshirani via Mike McCandless)
* LUCENE-6063: Allow overriding whether/how ConcurrentMergeScheduler
stalls incoming threads when merges are falling behind (Mike
McCandless)
* LUCENE-5833: DocumentDictionary now enumerates each value separately
in a multi-valued field (not just the first value), so you can build
suggesters from multi-valued fields. (Varun Thacker via Mike
McCandless)
* LUCENE-6077: Added a filter cache. (Adrien Grand, Robert Muir)
* LUCENE-6088: TermsFilter implements Accountable. (Adrien Grand)
* LUCENE-6034: The default highlighter when used with QueryScorer will highlight payload-sensitive
queries provided that term vectors with positions, offsets, and payloads are present. This is the
only highlighter that can highlight such queries accurately. (David Smiley)
* LUCENE-5914: Add an option to Lucene50Codec to support either BEST_SPEED
or BEST_COMPRESSION for stored fields. (Adrien Grand, Robert Muir)
* LUCENE-6119: Add auto-IO-throttling to ConcurrentMergeScheduler, to
rate limit IO writes for each merge depending on incoming merge
rate. (Mike McCandless)
* LUCENE-6155: Add payload support to MemoryIndex. The default highlighter's
QueryScorer and WeighedSpanTermExtractor now have setUsePayloads(bool).
(David Smiley)
* LUCENE-6166: Deletions (alone) can now trigger new merges. (Mike McCandless)
* LUCENE-6177: Add CustomAnalyzer that allows to configure analyzers
like you do in Solr's index schema. This class has a builder API to configure
Tokenizers, TokenFilters, and CharFilters based on their SPI names
and parameters as documented by the corresponding factories.
(Uwe Schindler)
Optimizations
* LUCENE-5960: Use a more efficient bitset, not a Set<Integer>, to
track visited states. (Markus Heiden via Mike McCandless)
* LUCENE-5959: Don't allocate excess memory when building automaton in
finish. (Markus Heiden via Mike McCandless)
* LUCENE-5963: Reduce memory allocations in
AnalyzingSuggester. (Markus Heiden via Mike McCandless)
* LUCENE-5938: MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE is now faster on
queries that match few documents by using a sparse bit set implementation.
(Adrien Grand)
* LUCENE-5969: Refactor merging to be more efficient, checksum calculation is
per-segment/per-producer, and norms and doc values merging no longer cause
RAM spikes for latent fields. (Mike McCandless, Robert Muir)
* LUCENE-5983: CachingWrapperFilter now uses a new DocIdSet implementation
called RoaringDocIdSet instead of WAH8DocIdSet. (Adrien Grand)
* LUCENE-6022: DocValuesDocIdSet checks live docs before doc values.
(Adrien Grand)
* LUCENE-6030: Add norms patched compression for a small number of common values
(Ryan Ernst)
* LUCENE-6040: Speed up EliasFanoDocIdSet through broadword bit selection.
(Paul Elschot)
* LUCENE-6033: CachingTokenFilter now uses ArrayList not LinkedList, and has new
isCached() method. (David Smiley)
* LUCENE-6031: TokenSources (in the default highlighter) converts term vectors into a
TokenStream much faster in linear time (not N*log(N) using less memory, and with reset()
implemented. Only one of offsets or positions are required of the term vector.
(David Smiley)
* LUCENE-6089, LUCENE-6090: Tune CompressionMode.HIGH_COMPRESSION for
better compression and less cpu usage. (Adrien Grand, Robert Muir)
* LUCENE-6034: QueryScorer, used by the default highlighter, needn't re-index the provided
TokenStream with MemoryIndex when it comes from TokenSources (term vectors) with offsets and
positions. (David Smiley)
* LUCENE-5951: ConcurrentMergeScheduler detects whether the index is on SSD or not
and does a better job defaulting its settings. This only works on Linux for now;
other OS's will continue to use the previous defaults (tuned for spinning disks).
(Robert Muir, Uwe Schindler, hossman, Mike McCandless)
* LUCENE-6131: Optimize SortingMergePolicy. (Robert Muir)
* LUCENE-6133: Improve default StoredFieldsWriter.merge() to be more efficient.
(Robert Muir)
* LUCENE-6145: Make EarlyTerminatingSortingCollector able to early-terminate
when the sort order is a prefix of the index-time order. (Adrien Grand)
* LUCENE-6178: Score boolean queries containing MUST_NOT clauses with BooleanScorer2,
to use skip list data and avoid unnecessary scoring. (Adrien Grand, Robert Muir)
API Changes
* LUCENE-5900: Deprecated more constructors taking Version in *InfixSuggester and
ICUCollationKeyAnalyzer, and removed TEST_VERSION_CURRENT from the test framework.
(Ryan Ernst)
* LUCENE-4535: oal.util.FilterIterator is now an internal API.
(Adrien Grand)
* LUCENE-4924: DocIdSetIterator.docID() must now return -1 when the iterator is
not positioned. This change affects all classes that inherit from
DocIdSetIterator, including DocsEnum and DocsAndPositionsEnum. (Adrien Grand)
* LUCENE-5127: Reduce RAM usage of FixedGapTermsIndex. Remove
IndexWriterConfig.setTermIndexInterval, IndexWriterConfig.setReaderTermsIndexDivisor,
and termsIndexDivisor from StandardDirectoryReader. These options have been no-ops
with the default codec since Lucene 4.0. If you want to configure the interval for
this term index, pass it directly in your codec, where it can also be configured
per-field. (Robert Muir)
* LUCENE-5388: Remove Reader from Tokenizer's constructor and from
Analyzer's createComponents. TokenStreams now always get their input
via setReader.
(Benson Margulies via Robert Muir - pull request #16)
* LUCENE-5527: The Collector API has been refactored to use a dedicated Collector
per leaf. (Shikhar Bhushan, Adrien Grand)
* LUCENE-5702: The FieldComparator API has been refactor to a per-leaf API, just
like Collectors. (Adrien Grand)
* LUCENE-4246: IndexWriter.close now always closes, even if it throws
an exception. The new IndexWriterConfig.setCommitOnClose (default
true) determines whether close() should commit before closing.
* LUCENE-5608, LUCENE-5565: Refactor SpatialPrefixTree/Cell API. Doesn't use Strings
as tokens anymore, and now iterates cells on-demand during indexing instead of
building a collection. RPT now has more setters. (David Smiley)
* LUCENE-5666: Change uninverted access (sorting, faceting, grouping, etc)
to use the DocValues API instead of FieldCache. For FieldCache functionality,
use UninvertingReader in lucene/misc (or implement your own FilterReader).
UninvertingReader is more efficient: supports multi-valued numeric fields,
detects when a multi-valued field is single-valued, reuses caches
of compatible types (e.g. SORTED also supports BINARY and SORTED_SET access
without insanity). "Insanity" is no longer possible unless you explicitly want it.
Rename FieldCache* and DocTermOrds* classes in the search package to DocValues*.
Move SortedSetSortField to core and add SortedSetFieldSource to queries/, which
takes the same selectors. Add helper methods to DocValues.java that are better
suited for search code (never return null, etc). (Mike McCandless, Robert Muir)
* LUCENE-5871: Remove Version from IndexWriterConfig. Use
IndexWriterConfig.setCommitOnClose to change the behavior of IndexWriter.close().
The default has been changed to match that of 4.x.
(Ryan Ernst, Mike McCandless)
* LUCENE-5965: CorruptIndexException requires a String or DataInput resource.
(Robert Muir)
* LUCENE-5972: IndexFormatTooOldException and IndexFormatTooNewException now
extend from IOException.
(Ryan Ernst, Robert Muir)
* LUCENE-5569: *AtomicReader/AtomicReaderContext have been renamed to *LeafReader/LeafReaderContext.
(Ryan Ernst)
* LUCENE-5938: Removed MultiTermQuery.ConstantScoreAutoRewrite as
MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE is usually better. (Adrien Grand)
* LUCENE-5924: Rename CheckIndex -fix option to -exorcise. This option does not
actually fix the index, it just drops data. (Robert Muir)
* LUCENE-5969: Add Codec.compoundFormat, which handles the encoding of compound
files. Add getMergeInstance() to codec producer APIs, which can be overridden
to return an instance optimized for merging instead of searching. Add
Terms.getStats() which can return additional codec-specific statistics about a field.
Change instance method SegmentInfos.read() to two static methods: SegmentInfos.readCommit()
and SegmentInfos.readLatestCommit().
(Mike McCandless, Robert Muir)
* LUCENE-5992: Remove FieldInfos from SegmentInfosWriter.write API. (Robert Muir, Mike McCandless)
* LUCENE-5998: Simplify Field/SegmentInfoFormat to read+write methods.
(Robert Muir)
* LUCENE-6000: Removed StandardTokenizerInterface. Tokenizers now use
their jflex impl directly.
(Ryan Ernst)
* LUCENE-6006: Removed FieldInfo.normType since it's redundant: it
will be DocValuesType.NUMERIC if the field indexed and does not omit
norms, else null. (Robert Muir, Mike McCandless)
* LUCENE-6013: Removed indexed boolean from IndexableFieldType and
FieldInfo, since it's redundant with IndexOptions != null. (Robert
Muir, Mike McCandless)
* LUCENE-6021: FixedBitSet.nextSetBit now returns DocIdSetIterator.NO_MORE_DOCS
instead of -1 when there are no more bits which are set. (Adrien Grand)
* LUCENE-5953: Directory and LockFactory APIs were restructured: Locking is
now under the responsibility of the Directory implementation. LockFactory is
only used by subclasses of BaseDirectory to delegate locking to an impl
class. LockFactories are now singletons and are responsible to create a Lock
instance based on a Directory implementation passed to the factory method.
See MIGRATE.txt for more details. (Uwe Schindler, Robert Muir)
* LUCENE-6062: Throw exception instead of silently doing nothing if you try to
sort/group/etc on a misconfigured field (e.g. no docvalues, no UninvertingReader, etc).
(Robert Muir)
* LUCENE-6068: LeafReader.fields() never returns null. (Robert Muir)
* LUCENE-6082: Remove abort() from codec apis. (Robert Muir)
* LUCENE-6084: IndexOutput's constructor now requires a String
resourceDescription so its toString is sane (Robert Muir, Mike
McCandless)
* LUCENE-6087: Allow passing custom DirectoryReader to SearcherManager
(Mike McCandless)
* LUCENE-6085: Undeprecate SegmentInfo attributes, but add safety so they
won't be trappy if codec tries to use them during docvalues updates.
(Robert Muir)
* LUCENE-6097: Remove dangerous / overly expert
IndexWriter.abortMerges and waitForMerges methods. (Robert Muir,
Mike McCandless)
* LUCENE-6099: Add FilterDirectory.unwrap and
FilterDirectoryReader.unwrap (Simon Willnauer, Mike McCandless)
* LUCENE-6121: CachingTokenFilter.reset() now propagates to its input if called before
incrementToken(). You must call reset() now on this filter instead of doing it a-priori on the
input(), which previously didn't work. (David Smiley, Robert Muir)
* LUCENE-6147: Make the core Accountables.namedAccountable function public
(Ryan Ernst)
* LUCENE-6150: Remove staleFiles set and onIndexOutputClosed() from FSDirectory.
(Uwe Schindler, Robert Muir, Mike McCandless)
* LUCENE-6146: Replaced Directory.copy() with Directory.copyFrom().
(Robert Muir)
* LUCENE-6149: Infix suggesters' highlighting and allTermsRequired can
be set at the constructor for non-contextual lookup.
(Boon Low, Tomás Fernández Löbbe)
* LUCENE-6158, LUCENE-6165: IndexWriter.addIndexes(IndexReader...) changed to
addIndexes(CodecReader...) (Robert Muir)
* LUCENE-6179: Out-of-order scoring is not allowed anymore, so
Weight.scoresDocsOutOfOrder and LeafCollector.acceptsDocsOutOfOrder have been
removed and boolean queries now always score in order.
* LUCENE-6212: IndexWriter no longer accepts per-document Analyzer to
add/updateDocument. These methods were trappy as they made it
easy to accidentally index tokens that were not easily
searchable. (Mike McCandless)
Bug Fixes
* LUCENE-5650: Enforce read-only access to any path outside the temporary
folder via security manager, and make test temp dirs absolute.
(Ryan Ernst, Dawid Weiss)
* LUCENE-5948: RateLimiter now fully inits itself on init. (Varun
Thacker via Mike McCandless)
* LUCENE-5981: CheckIndex obtains write.lock, since with some parameters it
may modify the index, and to prevent false corruption reports, as it does
not have the regular "spinlock" of DirectoryReader.open. It now implements
Closeable and you must close it to release the lock. (Mike McCandless, Robert Muir)
* LUCENE-6004: Don't highlight the LookupResult.key returned from
AnalyzingInfixSuggester (Christian Reuschling, jane chang via Mike McCandless)
* LUCENE-5980: Don't let document length overflow. (Robert Muir)
* LUCENE-5999: Fix backcompat support for StandardTokenizer
(Ryan Ernst)
* LUCENE-5961: Fix the exists() method for FunctionValues returned by many ValueSources to
behave properly when wrapping other ValueSources which do not exist for the specified document
(hossman)
* LUCENE-6039: Add IndexOptions.NONE and DocValuesType.NONE instead of
using null to mean not index and no doc values, renamed
IndexOptions.DOCS_ONLY to DOCS, and pulled IndexOptions and
DocValues out of FieldInfo into their own classes in
org.apache.lucene.index (Simon Willnauer, Robert Muir, Mike
McCandless)
* LUCENE-6043: Fix backcompat support for UAX29URLEmailTokenizer
(Ryan Ernst)
* LUCENE-6041: Remove sugar methods FieldInfo.isIndexed and
FieldInfo.hasDocValues. (Robert Muir, Mike McCandless)
* LUCENE-6044: Fix backcompat support for token filters with enablePositionIncrements=false.
Also fixed backcompat for TrimFilter with updateOffsets=true. These options
are supported with a match version before 4.4, and no longer valid at all with 5.0.
(Ryan Ernst)
* LUCENE-6042: CustomScoreQuery explain was incorrect in some cases,
such as when nested inside a boolean query. (Denis Lantsman via Robert Muir)
* LUCENE-6046: Add maxDeterminizedStates safety to determinize (which has
an exponential worst case) so that if it would create too many states, it
now throws an exception instead of exhausting CPU/RAM. (Nik
Everett via Mike McCandless)
* LUCENE-6054: Allow repeating the empty automaton (Nik Everett via
Mike McCandless)
* LUCENE-6049: Don't throw cryptic exception writing a segment when
the only docs in it had fields that hit non-aborting exceptions
during indexing but also had doc values. (Mike McCandless)
* LUCENE-6055: PayloadAttribute.clone() now does a deep clone of the underlying
bytes. (Shai Erera)
* LUCENE-6060: Remove dangerous IndexWriter.unlock method (Simon
Willnauer, Mike McCandless)
* LUCENE-6062: Pass correct fieldinfos to docvalues producer when the
segment has updates. (Mike McCandless, Shai Erera, Robert Muir)
* LUCENE-6075: Don't overflow int in SimpleRateLimiter (Boaz Leskes
via Mike McCandless)
* LUCENE-5987: IndexWriter will now forcefully close itself on
aborting exception (an exception that would otherwise cause silent
data loss). (Robert Muir, Mike McCandless)
* LUCENE-6094: Allow IW.rollback to stop ConcurrentMergeScheduler even
when it's stalling because there are too many merges. (Mike McCandless)
* LUCENE-6105: Don't cache FST root arcs if the number of root arcs is
small, or if the cache would be > 20% of the size of the FST.
(Robert Muir, Mike McCandless)
* LUCENE-6124: Fix double-close() problems in codec and store APIs.
(Robert Muir)
* LUCENE-6152: Fix double close problems in OutputStreamIndexOutput.
(Uwe Schindler)
* LUCENE-6139: Highlighter: TokenGroup start & end offset getters should have
been returning the offsets of just the matching tokens in the group when
there's a distinction. (David Smiley)
* LUCENE-6173: NumericTermAttribute and spatial/CellTokenStream do not clone
their BytesRef(Builder)s. Also equals/hashCode was missing. (Uwe Schindler)
* LUCENE-6205: Fixed intermittent concurrency issue that could cause
FileNotFoundException when writing doc values updates at the same
time that a merge kicks off. (Mike McCandless)
* LUCENE-6192: Fix int overflow corruption case in skip data for
high frequency terms in extremely large indices (Robert Muir, Mike
McCandless)
* LUCENE-6093: Don't throw NullPointerException from
BlendedInfixSuggester for lookups that do not end in a prefix
token. (jane chang via Mike McCandless)
* LUCENE-6214: Fixed IndexWriter deadlock when one thread is
committing while another opens a near-real-time reader and an
unrecoverable (tragic) exception is hit. (Simon Willnauer, Mike
McCandless)
Documentation
* LUCENE-5392: Add/improve analysis package documentation to reflect
analysis API changes. (Benson Margulies via Robert Muir - pull request #17)
* LUCENE-6057: Improve Sort(SortField) docs (Martin Braun via Mike McCandless)
* LUCENE-6112: Fix compile error in FST package example code
(Tomoko Uchida via Koji Sekiguchi)
Tests
* LUCENE-5957: Add option for tests to not randomize codec
(Ryan Ernst)
* LUCENE-5974: Add check that backcompat indexes use default codecs
(Ryan Ernst)
* LUCENE-5971: Create addBackcompatIndexes.py script to build and add
backcompat test indexes for a given lucene version. Also renamed backcompat
index files to use Version.toString() in filename.
(Ryan Ernst)
* LUCENE-6002: Monster tests no longer fail. Most of them now have an 80 hour
timeout, effectively removing the timeout. The tests that operate near the 2
billion limit now use IndexWriter.MAX_DOCS instead of Integer.MAX_VALUE.
Some of the slow Monster tests now explicitly choose the default codec.
(Mike McCandless, Shawn Heisey)
* LUCENE-5968: Improve error message when 'ant beast' is run on top-level
modules. (Ramkumar Aiyengar, Uwe Schindler)
* LUCENE-6120: Fix MockDirectoryWrapper's close() handling.
(Mike McCandless, Robert Muir)
Build
* LUCENE-5909: Smoke tester now has better command line parsing and
optionally also runs on Java 8. (Ryan Ernst, Uwe Schindler)
* LUCENE-5902: Add bumpVersion.py script to manage version increase after release branch is cut.
* LUCENE-5962: Rename diffSources.py to createPatch.py and make it work with all text file types.
(Ryan Ernst)
* LUCENE-5995: Upgrade ICU to 54.1 (Robert Muir)
* LUCENE-6070: Upgrade forbidden-apis to 1.7 (Uwe Schindler)
Other
* LUCENE-5563: Removed sep layout: which has fallen behind on features and doesn't
perform as well as other options. (Robert Muir)
* LUCENE-4086: Removed support for Lucene 3.x indexes. See migration guide for
more information. (Robert Muir)
* LUCENE-5858: Moved Lucene 4 compatibility codecs to 'lucene-backward-codecs.jar'.
(Adrien Grand, Robert Muir)
* LUCENE-5915: Remove Pulsing postings format. (Robert Muir)
* LUCENE-6213: Add useful exception message when commit contains segments from legacy codecs.
(Ryan Ernst)
======================= Lucene 4.10.4 ======================
* LUCENE-6207: Fixed consumption of several terms enums on the same
sorted (set) doc values instance at the same time.
(Tom Shally, Robert Muir, Adrien Grand)
======================= Lucene 4.10.3 ======================
Bug fixes
* LUCENE-3229: Overlapping ordered SpanNearQuery spans should not match.
(Ludovic Boutros, Paul Elschot, Greg Dearing, ehatcher)
======================= Lucene 4.10.2 ======================
Bug fixes
* LUCENE-5977: Fix tokenstream safety checks in IndexWriter to properly
work across multi-valued fields. Previously some cases across multi-valued
fields would happily create a corrupt index. (Dawid Weiss, Robert Muir)
* LUCENE-6019: Detect when DocValuesType illegally changes for the
same field name. Also added -Dtests.asserts=true|false so we can
run tests with and without assertions. (Simon Willnauer, Robert
Muir, Mike McCandless).
======================= Lucene 4.10.1 ======================
Bug fixes
* LUCENE-5934: Fix backwards compatibility for 4.0 indexes.
(Ian Lea, Uwe Schindler, Robert Muir, Ryan Ernst)
* LUCENE-5939: Regenerate old backcompat indexes to ensure they were built with
the exact release
(Ryan Ernst, Uwe Schindler)
* LUCENE-5952: Improve error messages when version cannot be parsed;
don't check for too old or too new major version (it's too low level
to enforce here); use simple string tokenizer. (Ryan Ernst, Uwe Schindler,
Robert Muir, Mike McCandless)
* LUCENE-5958: Don't let exceptions during checkpoint corrupt the index.
Refactor existing OOM handling too, so you don't need to handle OOM special
for every IndexWriter method: instead such disasters will cause IW to close itself
defensively. (Robert Muir, Mike McCandless)
* LUCENE-5904: Fixed a corruption case that can happen when 1)
IndexWriter is uncleanly shut-down (OS crash, power loss, etc.), 2)
on startup, when a new IndexWriter is created, a virus checker is
holding some of the previously written but unused files open and
preventing deletion, 3) IndexWriter writes these files again during
the course of indexing, then the files can later be deleted, causing
corruption. This case was detected by adding evilness to
MockDirectoryWrapper to have it simulate a virus checker holding a
file open and preventing deletion (Robert Muir, Mike McCandless)
* LUCENE-5916: Stat
...