📄 indexmodifier.cs
字号:
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using Analyzer = Lucene.Net.Analysis.Analyzer;
using Document = Lucene.Net.Documents.Document;
using Directory = Lucene.Net.Store.Directory;
using FSDirectory = Lucene.Net.Store.FSDirectory;
namespace Lucene.Net.Index
{
/// <summary> <p>[Note that as of <b>2.1</b>, all but one of the
/// methods in this class are available via {@link
/// IndexWriter}. The one method that is not available is
/// {@link #DeleteDocument(int)}.]</p>
///
/// A class to modify an index, i.e. to delete and add documents. This
/// class hides {@link IndexReader} and {@link 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.
///
/// <p>Note that you cannot create more than one <code>IndexModifier</code> object
/// on the same directory at the same time.
///
/// <p>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 = -->
/// <div align="left" class="java">
/// <table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
/// <tr>
/// <!-- start source code -->
/// <td nowrap="nowrap" valign="top" align="left">
/// <code>
/// <font color="#ffffff"> </font><font color="#000000">Analyzer analyzer = </font><font color="#7f0055"><b>new </b></font><font color="#000000">StandardAnalyzer</font><font color="#000000">()</font><font color="#000000">;</font><br/>
/// <font color="#ffffff"> </font><font color="#3f7f5f">// create an index in /tmp/index, overwriting an existing one:</font><br/>
/// <font color="#ffffff"> </font><font color="#000000">IndexModifier indexModifier = </font><font color="#7f0055"><b>new </b></font><font color="#000000">IndexModifier</font><font color="#000000">(</font><font color="#2a00ff">"/tmp/index"</font><font color="#000000">, analyzer, </font><font color="#7f0055"><b>true</b></font><font color="#000000">)</font><font color="#000000">;</font><br/>
/// <font color="#ffffff"> </font><font color="#000000">Document doc = </font><font color="#7f0055"><b>new </b></font><font color="#000000">Document</font><font color="#000000">()</font><font color="#000000">;</font><br/>
/// <font color="#ffffff"> </font><font color="#000000">doc.add</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">Field</font><font color="#000000">(</font><font color="#2a00ff">"id"</font><font color="#000000">, </font><font color="#2a00ff">"1"</font><font color="#000000">, Field.Store.YES, Field.Index.UN_TOKENIZED</font><font color="#000000">))</font><font color="#000000">;</font><br/>
/// <font color="#ffffff"> </font><font color="#000000">doc.add</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">Field</font><font color="#000000">(</font><font color="#2a00ff">"body"</font><font color="#000000">, </font><font color="#2a00ff">"a simple test"</font><font color="#000000">, Field.Store.YES, Field.Index.TOKENIZED</font><font color="#000000">))</font><font color="#000000">;</font><br/>
/// <font color="#ffffff"> </font><font color="#000000">indexModifier.addDocument</font><font color="#000000">(</font><font color="#000000">doc</font><font color="#000000">)</font><font color="#000000">;</font><br/>
/// <font color="#ffffff"> </font><font color="#7f0055"><b>int </b></font><font color="#000000">deleted = indexModifier.delete</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">Term</font><font color="#000000">(</font><font color="#2a00ff">"id"</font><font color="#000000">, </font><font color="#2a00ff">"1"</font><font color="#000000">))</font><font color="#000000">;</font><br/>
/// <font color="#ffffff"> </font><font color="#000000">System.out.println</font><font color="#000000">(</font><font color="#2a00ff">"Deleted " </font><font color="#000000">+ deleted + </font><font color="#2a00ff">" document"</font><font color="#000000">)</font><font color="#000000">;</font><br/>
/// <font color="#ffffff"> </font><font color="#000000">indexModifier.flush</font><font color="#000000">()</font><font color="#000000">;</font><br/>
/// <font color="#ffffff"> </font><font color="#000000">System.out.println</font><font color="#000000">(</font><font color="#000000">indexModifier.docCount</font><font color="#000000">() </font><font color="#000000">+ </font><font color="#2a00ff">" docs in index"</font><font color="#000000">)</font><font color="#000000">;</font><br/>
/// <font color="#ffffff"> </font><font color="#000000">indexModifier.close</font><font color="#000000">()</font><font color="#000000">;</font></code>
/// </td>
/// <!-- end source code -->
/// </tr>
/// </table>
/// </div>
/// <!-- = END of automatically generated HTML code = -->
/// <!-- ======================================================== -->
///
/// <p>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 <code>IndexModifier</code>.
///
/// <p>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).
///
/// <p>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.
///
/// </summary>
/// <author> Daniel Naber
/// </author>
public class IndexModifier
{
private void InitBlock()
{
maxBufferedDocs = IndexWriter.DEFAULT_MAX_BUFFERED_DOCS;
maxFieldLength = IndexWriter.DEFAULT_MAX_FIELD_LENGTH;
mergeFactor = IndexWriter.DEFAULT_MERGE_FACTOR;
}
protected internal IndexWriter indexWriter = null;
protected internal IndexReader indexReader = null;
protected internal Directory directory = null;
protected internal Analyzer analyzer = null;
protected internal bool open = false;
// Lucene defaults:
protected internal System.IO.StreamWriter infoStream = null;
protected internal bool useCompoundFile = true;
protected internal int maxBufferedDocs;
protected internal int maxFieldLength;
protected internal int mergeFactor;
/// <summary> Open an index with write access.
///
/// </summary>
/// <param name="directory">the index directory
/// </param>
/// <param name="analyzer">the analyzer to use for adding new documents
/// </param>
/// <param name="create"><code>true</code> to create the index or overwrite the existing one;
/// <code>false</code> to append to the existing index
/// </param>
public IndexModifier(Directory directory, Analyzer analyzer, bool create)
{
InitBlock();
Init(directory, analyzer, create);
}
/// <summary> Open an index with write access.
///
/// </summary>
/// <param name="dirName">the index directory
/// </param>
/// <param name="analyzer">the analyzer to use for adding new documents
/// </param>
/// <param name="create"><code>true</code> to create the index or overwrite the existing one;
/// <code>false</code> to append to the existing index
/// </param>
public IndexModifier(System.String dirName, Analyzer analyzer, bool create)
{
InitBlock();
Directory dir = FSDirectory.GetDirectory(dirName);
Init(dir, analyzer, create);
}
/// <summary> Open an index with write access.
///
/// </summary>
/// <param name="file">the index directory
/// </param>
/// <param name="analyzer">the analyzer to use for adding new documents
/// </param>
/// <param name="create"><code>true</code> to create the index or overwrite the existing one;
/// <code>false</code> to append to the existing index
/// </param>
public IndexModifier(System.IO.FileInfo file, Analyzer analyzer, bool create)
{
InitBlock();
Directory dir = FSDirectory.GetDirectory(file);
Init(dir, analyzer, create);
}
/// <summary> Initialize an IndexWriter.</summary>
/// <throws> IOException </throws>
protected internal virtual void Init(Directory directory, Analyzer analyzer, bool create)
{
this.directory = directory;
lock (this.directory)
{
this.analyzer = analyzer;
indexWriter = new IndexWriter(directory, analyzer, create);
open = true;
}
}
/// <summary> Throw an IllegalStateException if the index is closed.</summary>
/// <throws> IllegalStateException </throws>
protected internal virtual void AssureOpen()
{
if (!open)
{
throw new System.SystemException("Index is closed");
}
}
/// <summary> Close the IndexReader and open an IndexWriter.</summary>
/// <throws> IOException </throws>
protected internal virtual void CreateIndexWriter()
{
if (indexWriter == null)
{
if (indexReader != null)
{
indexReader.Close();
indexReader = null;
}
indexWriter = new IndexWriter(directory, analyzer, false);
indexWriter.SetInfoStream(infoStream);
indexWriter.SetUseCompoundFile(useCompoundFile);
indexWriter.SetMaxBufferedDocs(maxBufferedDocs);
indexWriter.SetMaxFieldLength(maxFieldLength);
indexWriter.SetMergeFactor(mergeFactor);
}
}
/// <summary> Close the IndexWriter and open an IndexReader.</summary>
/// <throws> IOException </throws>
protected internal virtual void CreateIndexReader()
{
if (indexReader == null)
{
if (indexWriter != null)
{
indexWriter.Close();
indexWriter = null;
}
indexReader = IndexReader.Open(directory);
}
}
/// <summary> Make sure all changes are written to disk.</summary>
/// <throws> IOException </throws>
public virtual void Flush()
{
lock (directory)
{
AssureOpen();
if (indexWriter != null)
{
indexWriter.Close();
indexWriter = null;
CreateIndexWriter();
}
else
{
indexReader.Close();
indexReader = null;
CreateIndexReader();
}
}
}
/// <summary> Adds a document to this index, using the provided analyzer instead of the
/// one specific in the constructor. If the document contains more than
/// {@link #SetMaxFieldLength(int)} terms for a given field, the remainder are
/// discarded.
/// </summary>
/// <seealso cref="Analyzer)">
/// </seealso>
/// <throws> IllegalStateException if the index is closed </throws>
public virtual void AddDocument(Document doc, Analyzer docAnalyzer)
{
lock (directory)
{
AssureOpen();
CreateIndexWriter();
if (docAnalyzer != null)
indexWriter.AddDocument(doc, docAnalyzer);
else
indexWriter.AddDocument(doc);
}
}
/// <summary> Adds a document to this index. If the document contains more than
/// {@link #SetMaxFieldLength(int)} terms for a given field, the remainder are
/// discarded.
/// </summary>
/// <seealso cref="IndexWriter#AddDocument(Document)">
/// </seealso>
/// <throws> IllegalStateException if the index is closed </throws>
public virtual void AddDocument(Document doc)
{
AddDocument(doc, null);
}
/// <summary> Deletes all documents containing <code>term</code>.
/// 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.
/// </summary>
/// <returns> the number of documents deleted
/// </returns>
/// <seealso cref="IndexReader#DeleteDocuments(Term)">
/// </seealso>
/// <throws> IllegalStateException if the index is closed </throws>
public virtual int DeleteDocuments(Term term)
{
lock (directory)
{
AssureOpen();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -