📄 indexreader.cs
字号:
/// </returns>
public virtual bool IsOptimized()
{
return segmentInfos.Count == 1 && HasDeletions() == false;
}
/// <summary> Return an array of term frequency vectors for the specified document.
/// The array contains a vector for each vectorized field in the document.
/// Each vector contains terms and frequencies for all terms in a given vectorized field.
/// If no such fields existed, the method returns null. The term vectors that are
/// returned my either be of type TermFreqVector or of type TermPositionsVector if
/// positions or offsets have been stored.
///
/// </summary>
/// <param name="docNumber">document for which term frequency vectors are returned
/// </param>
/// <returns> array of term frequency vectors. May be null if no term vectors have been
/// stored for the specified document.
/// </returns>
/// <throws> IOException if index cannot be accessed </throws>
/// <seealso cref="Lucene.Net.Documents.Field.TermVector">
/// </seealso>
abstract public TermFreqVector[] GetTermFreqVectors(int docNumber);
/// <summary> Return a term frequency vector for the specified document and field. The
/// returned vector contains terms and frequencies for the terms in
/// the specified field of this document, if the field had the storeTermVector
/// flag set. If termvectors had been stored with positions or offsets, a
/// TermPositionsVector is returned.
///
/// </summary>
/// <param name="docNumber">document for which the term frequency vector is returned
/// </param>
/// <param name="field">field for which the term frequency vector is returned.
/// </param>
/// <returns> term frequency vector May be null if field does not exist in the specified
/// document or term vector was not stored.
/// </returns>
/// <throws> IOException if index cannot be accessed </throws>
/// <seealso cref="Lucene.Net.Documents.Field.TermVector">
/// </seealso>
abstract public TermFreqVector GetTermFreqVector(int docNumber, System.String field);
/// <summary> Returns <code>true</code> if an index exists at the specified directory.
/// If the directory does not exist or if there is no index in it.
/// <code>false</code> is returned.
/// </summary>
/// <param name="directory">the directory to check for an index
/// </param>
/// <returns> <code>true</code> if an index exists; <code>false</code> otherwise
/// </returns>
public static bool IndexExists(System.String directory)
{
return IndexExists(new System.IO.FileInfo(directory));
}
/// <summary> Returns <code>true</code> if an index exists at the specified directory.
/// If the directory does not exist or if there is no index in it.
/// </summary>
/// <param name="directory">the directory to check for an index
/// </param>
/// <returns> <code>true</code> if an index exists; <code>false</code> otherwise
/// </returns>
public static bool IndexExists(System.IO.FileInfo directory)
{
return SegmentInfos.GetCurrentSegmentGeneration(System.IO.Directory.GetFileSystemEntries(directory.FullName)) != - 1;
}
/// <summary> Returns <code>true</code> if an index exists at the specified directory.
/// If the directory does not exist or if there is no index in it.
/// </summary>
/// <param name="directory">the directory to check for an index
/// </param>
/// <returns> <code>true</code> if an index exists; <code>false</code> otherwise
/// </returns>
/// <throws> IOException if there is a problem with accessing the index </throws>
public static bool IndexExists(Directory directory)
{
return SegmentInfos.GetCurrentSegmentGeneration(directory) != - 1;
}
/// <summary>Returns the number of documents in this index. </summary>
public abstract int NumDocs();
/// <summary>Returns one greater than the largest possible document number.
/// This may be used to, e.g., determine how big to allocate an array which
/// will have an element for every document number in an index.
/// </summary>
public abstract int MaxDoc();
/// <summary>Returns the stored fields of the <code>n</code><sup>th</sup>
/// <code>Document</code> in this index.
/// </summary>
public virtual Document Document(int n)
{
return Document(n, null);
}
/// <summary> Get the {@link Lucene.Net.Documents.Document} at the <code>n</code><sup>th</sup> position. The {@link Lucene.Net.Documents.FieldSelector}
/// may be used to determine what {@link Lucene.Net.Documents.Field}s to load and how they should be loaded.
///
/// <b>NOTE:</b> If this Reader (more specifically, the underlying {@link FieldsReader} is closed before the lazy {@link Lucene.Net.Documents.Field} is
/// loaded an exception may be thrown. If you want the value of a lazy {@link Lucene.Net.Documents.Field} to be available after closing you must
/// explicitly load it or fetch the Document again with a new loader.
///
///
/// </summary>
/// <param name="n">Get the document at the <code>n</code><sup>th</sup> position
/// </param>
/// <param name="fieldSelector">The {@link Lucene.Net.Documents.FieldSelector} to use to determine what Fields should be loaded on the Document. May be null, in which case all Fields will be loaded.
/// </param>
/// <returns> The stored fields of the {@link Lucene.Net.Documents.Document} at the nth position
/// </returns>
/// <throws> IOException If there is a problem reading this document </throws>
/// <summary>
/// </summary>
/// <seealso cref="Lucene.Net.Documents.Fieldable">
/// </seealso>
/// <seealso cref="Lucene.Net.Documents.FieldSelector">
/// </seealso>
/// <seealso cref="Lucene.Net.Documents.SetBasedFieldSelector">
/// </seealso>
/// <seealso cref="Lucene.Net.Documents.LoadFirstFieldSelector">
/// </seealso>
//When we convert to JDK 1.5 make this Set<String>
public abstract Document Document(int n, FieldSelector fieldSelector);
/// <summary>Returns true if document <i>n</i> has been deleted </summary>
public abstract bool IsDeleted(int n);
/// <summary>Returns true if any documents have been deleted </summary>
public abstract bool HasDeletions();
/// <summary>Returns true if there are norms stored for this field. </summary>
public virtual bool HasNorms(System.String field)
{
// backward compatible implementation.
// SegmentReader has an efficient implementation.
return Norms(field) != null;
}
/// <summary>Returns the byte-encoded normalization factor for the named field of
/// every document. This is used by the search code to score documents.
///
/// </summary>
/// <seealso cref="Lucene.Net.Documents.Field#SetBoost(float)">
/// </seealso>
public abstract byte[] Norms(System.String field);
/// <summary>Reads the byte-encoded normalization factor for the named field of every
/// document. This is used by the search code to score documents.
///
/// </summary>
/// <seealso cref="Lucene.Net.Documents.Field#SetBoost(float)">
/// </seealso>
public abstract void Norms(System.String field, byte[] bytes, int offset);
/// <summary>Expert: Resets the normalization factor for the named field of the named
/// document. The norm represents the product of the field's {@link
/// Fieldable#SetBoost(float) boost} and its {@link Similarity#LengthNorm(String,
/// int) length normalization}. Thus, to preserve the length normalization
/// values when resetting this, one should base the new value upon the old.
///
/// </summary>
/// <seealso cref="#Norms(String)">
/// </seealso>
/// <seealso cref="Similarity#DecodeNorm(byte)">
/// </seealso>
public void SetNorm(int doc, System.String field, byte value_Renamed)
{
lock (this)
{
if (directoryOwner)
AquireWriteLock();
hasChanges = true;
DoSetNorm(doc, field, value_Renamed);
}
}
/// <summary>Implements setNorm in subclass.</summary>
protected internal abstract void DoSetNorm(int doc, System.String field, byte value_Renamed);
/// <summary>Expert: Resets the normalization factor for the named field of the named
/// document.
///
/// </summary>
/// <seealso cref="#Norms(String)">
/// </seealso>
/// <seealso cref="Similarity#DecodeNorm(byte)">
/// </seealso>
public virtual void SetNorm(int doc, System.String field, float value_Renamed)
{
SetNorm(doc, field, Similarity.EncodeNorm(value_Renamed));
}
/// <summary>Returns an enumeration of all the terms in the index.
/// The enumeration is ordered by Term.compareTo(). Each term
/// is greater than all that precede it in the enumeration.
/// </summary>
public abstract TermEnum Terms();
/// <summary>Returns an enumeration of all terms after a given term.
/// The enumeration is ordered by Term.compareTo(). Each term
/// is greater than all that precede it in the enumeration.
/// </summary>
public abstract TermEnum Terms(Term t);
/// <summary>Returns the number of documents containing the term <code>t</code>. </summary>
public abstract int DocFreq(Term t);
/// <summary>Returns an enumeration of all the documents which contain
/// <code>term</code>. For each document, the document number, the frequency of
/// the term in that document is also provided, for use in search scoring.
/// Thus, this method implements the mapping:
/// <p><ul>
/// Term => <docNum, freq><sup>*</sup>
/// </ul>
/// <p>The enumeration is ordered by document number. Each document number
/// is greater than all that precede it in the enumeration.
/// </summary>
public virtual TermDocs TermDocs(Term term)
{
TermDocs termDocs = TermDocs();
termDocs.Seek(term);
return termDocs;
}
/// <summary>Returns an unpositioned {@link TermDocs} enumerator. </summary>
public abstract TermDocs TermDocs();
/// <summary>Returns an enumeration of all the documents which contain
/// <code>term</code>. For each document, in addition to the document number
/// and frequency of the term in that document, a list of all of the ordinal
/// positions of the term in the document is available. Thus, this method
/// implements the mapping:
///
/// <p><ul>
/// Term => <docNum, freq,
/// <pos<sub>1</sub>, pos<sub>2</sub>, ...
/// pos<sub>freq-1</sub>>
/// ><sup>*</sup>
/// </ul>
/// <p> This positional information faciliates phrase and proximity searching.
/// <p>The enumeration is ordered by document number. Each document number is
/// greater than all that precede it in the enumeration.
/// </summary>
public virtual TermPositions TermPositions(Term term)
{
TermPositions termPositions = TermPositions();
termPositions.Seek(term);
return termPositions;
}
/// <summary>Returns an unpositioned {@link TermPositions} enumerator. </summary>
public abstract TermPositions TermPositions();
/// <summary> Tries to acquire the WriteLock on this directory.
/// this method is only valid if this IndexReader is directory owner.
///
/// </summary>
/// <throws> IOException If WriteLock cannot be acquired. </throws>
private void AquireWriteLock()
{
if (stale)
throw new System.IO.IOException("IndexReader out of date and no longer valid for delete, undelete, or setNorm operations");
if (this.writeLock == null)
{
Lock writeLock = directory.MakeLock(IndexWriter.WRITE_LOCK_NAME);
if (!writeLock.Obtain(IndexWriter.WRITE_LOCK_TIMEOUT))
// obtain write lock
{
throw new System.IO.IOException("Index locked for write: " + writeLock);
}
this.writeLock = writeLock;
// we have to check whether index has changed since this reader was opened.
// if so, this reader is no longer valid for deletion
if (SegmentInfos.ReadCurrentVersion(directory) > segmentInfos.GetVersion())
{
stale = true;
this.writeLock.Release();
this.writeLock = null;
throw new System.IO.IOException("IndexReader out of date and no longer valid for delete, undelete, or setNorm operations");
}
}
}
/// <summary>Deletes the document numbered <code>docNum</code>. Once a document is
/// deleted it will not appear in TermDocs or TermPostitions enumerations.
/// Attempts to read its field with the {@link #document}
/// method will result in an error. The presence of this document may still be
/// reflected in the {@link #docFreq} statistic, though
/// this will be corrected eventually as the index is further modified.
/// </summary>
public void DeleteDocument(int docNum)
{
lock (this)
{
if (directoryOwner)
AquireWriteLock();
hasChanges = true;
DoDelete(docNum);
}
}
/// <summary>Implements deletion of the document numbered <code>docNum</code>.
/// Applications should call {@link #DeleteDocument(int)} or {@link #DeleteDocuments(Term)}.
/// </summary>
protected internal abstract void DoDelete(int docNum);
/// <summary>Deletes all documents that have a given <code>term</code> indexed.
/// 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.
/// See {@link #DeleteDocument(int)} for information about when this deletion will
/// become effective.
/// </summary>
/// <returns> the number of documents deleted
/// </returns>
public int DeleteDocuments(Term term)
{
TermDocs docs = TermDocs(term);
if (docs == null)
return 0;
int n = 0;
try
{
while (docs.Next())
{
DeleteDocument(docs.Doc());
n++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -