[Note that as of
2.1, all but one of the
methods in this class are available via
IndexWriter
. The one method that is not available is
deleteDocument(int)
.]
A class to modify an index, i.e. to delete and add documents. This
class hides
IndexReader
and
IndexWriter
so that you
do not need to care about implementation details such as that adding
documents is done via IndexWriter and deletion is done via IndexReader.
Note that you cannot create more than one
IndexModifier
object
on the same directory at the same time.
Example usage:
<!-- ======================================================== -->
<!-- = Java Sourcecode to HTML automatically converted code = -->
<!-- = Java2Html Converter V4.1 2004 by Markus Gebhard markus@jave.de = -->
<!-- = Further information: http://www.java2html.de = -->
Analyzer analyzer = new StandardAnalyzer();
// create an index in /tmp/index, overwriting an existing one:
IndexModifier indexModifier = new IndexModifier("/tmp/index", analyzer, true);
Document doc = new Document();
doc.add(new Field("id", "1", Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.add(new Field("body", "a simple test", Field.Store.YES, Field.Index.TOKENIZED));
indexModifier.addDocument(doc);
int deleted = indexModifier.delete(new Term("id", "1"));
System.out.println("Deleted " + deleted + " document");
indexModifier.flush();
System.out.println(indexModifier.docCount() + " docs in index");
indexModifier.close();
|
<!-- = END of automatically generated HTML code = -->
<!-- ======================================================== -->
Not all methods of IndexReader and IndexWriter are offered by this
class. If you need access to additional methods, either use those classes
directly or implement your own class that extends
IndexModifier
.
Although an instance of this class can be used from more than one
thread, you will not get the best performance. You might want to use
IndexReader and IndexWriter directly for that (but you will need to
care about synchronization yourself then).
While you can freely mix calls to add() and delete() using this class,
you should batch you calls for best performance. For example, if you
want to update 20 documents, you should first delete all those documents,
then add all the new documents.
infoStream
protected PrintStream infoStream
maxBufferedDocs
protected int maxBufferedDocs
maxFieldLength
protected int maxFieldLength
mergeFactor
protected int mergeFactor
open
protected boolean open
useCompoundFile
protected boolean useCompoundFile
IndexModifier
public IndexModifier(File file,
Analyzer analyzer,
boolean create)
throws IOException
Open an index with write access.
file
- the index directoryanalyzer
- the analyzer to use for adding new documentscreate
- true
to create the index or overwrite the existing one;
false
to append to the existing index
IndexModifier
public IndexModifier(String dirName,
Analyzer analyzer,
boolean create)
throws IOException
Open an index with write access.
dirName
- the index directoryanalyzer
- the analyzer to use for adding new documentscreate
- true
to create the index or overwrite the existing one;
false
to append to the existing index
IndexModifier
public IndexModifier(Directory directory,
Analyzer analyzer,
boolean create)
throws IOException
Open an index with write access.
directory
- the index directoryanalyzer
- the analyzer to use for adding new documentscreate
- true
to create the index or overwrite the existing one;
false
to append to the existing index
addDocument
public void addDocument(Document doc)
throws IOException
Adds a document to this index. If the document contains more than
setMaxFieldLength(int)
terms for a given field, the remainder are
discarded.
addDocument
public void addDocument(Document doc,
Analyzer docAnalyzer)
throws IOException
Adds a document to this index, using the provided analyzer instead of the
one specific in the constructor. If the document contains more than
setMaxFieldLength(int)
terms for a given field, the remainder are
discarded.
assureOpen
protected void assureOpen()
Throw an IllegalStateException if the index is closed.
close
public void close()
throws IOException
Close this index, writing all pending changes to disk.
createIndexReader
protected void createIndexReader()
throws IOException
Close the IndexWriter and open an IndexReader.
createIndexWriter
protected void createIndexWriter()
throws IOException
Close the IndexReader and open an IndexWriter.
deleteDocument
public void deleteDocument(int docNum)
throws IOException
Deletes the document numbered docNum
.
deleteDocuments
public int deleteDocuments(Term term)
throws IOException
Deletes all documents containing term
.
This is useful if one uses a document field to hold a unique ID string for
the document. Then to delete such a document, one merely constructs a
term with the appropriate field and the unique ID string as its text and
passes it to this method. Returns the number of documents deleted.
- the number of documents deleted
docCount
public int docCount()
Returns the number of documents currently in this index.
flush
public void flush()
throws IOException
Make sure all changes are written to disk.
getInfoStream
public PrintStream getInfoStream()
throws IOException
getMaxBufferedDocs
public int getMaxBufferedDocs()
throws IOException
getMaxFieldLength
public int getMaxFieldLength()
throws IOException
getMergeFactor
public int getMergeFactor()
throws IOException
getUseCompoundFile
public boolean getUseCompoundFile()
throws IOException
init
protected void init(Directory directory,
Analyzer analyzer,
boolean create)
throws IOException
Initialize an IndexWriter.
optimize
public void optimize()
throws IOException
Merges all segments together into a single segment, optimizing an index
for search.
setInfoStream
public void setInfoStream(PrintStream infoStream)
If non-null, information about merges and a message when
getMaxFieldLength()
is reached will be printed to this.
Example:
index.setInfoStream(System.err);
setMaxBufferedDocs
public void setMaxBufferedDocs(int maxBufferedDocs)
Determines the minimal number of documents required before the buffered
in-memory documents are merging and a new Segment is created.
Since Documents are merged in a
RAMDirectory
,
large value gives faster indexing. At the same time, mergeFactor limits
the number of files open in a FSDirectory.
The default value is 10.
setMaxFieldLength
public void setMaxFieldLength(int maxFieldLength)
The maximum number of terms that will be indexed for a single field in a
document. This limits the amount of memory required for indexing, so that
collections with very large files will not crash the indexing process by
running out of memory.
Note that this effectively truncates large documents, excluding from the
index terms that occur further in the document. If you know your source
documents are large, be sure to set this value high enough to accomodate
the expected size. If you set it to Integer.MAX_VALUE, then the only limit
is your memory, but you should anticipate an OutOfMemoryError.
By default, no more than 10,000 terms will be indexed for a field.
setMergeFactor
public void setMergeFactor(int mergeFactor)
Determines how often segment indices are merged by addDocument(). With
smaller values, less RAM is used while indexing, and searches on
unoptimized indices are faster, but indexing speed is slower. With larger
values, more RAM is used during indexing, and while searches on unoptimized
indices are slower, indexing is faster. Thus larger values (> 10) are best
for batch index creation, and smaller values (< 10) for indices that are
interactively maintained.
This must never be less than 2. The default value is 10.
setUseCompoundFile
public void setUseCompoundFile(boolean useCompoundFile)
Setting to turn on usage of a compound file. When on, multiple files
for each segment are merged into a single file once the segment creation
is finished. This is done regardless of what directory is in use.
toString
public String toString()