📄 segmentreader.cs
字号:
}
files.Add(name);
}
}
return files;
}
public override TermEnum Terms()
{
return tis.Terms();
}
public override TermEnum Terms(Term t)
{
return tis.Terms(t);
}
public override Document Document(int n, FieldSelector fieldSelector)
{
lock (this)
{
if (IsDeleted(n))
throw new System.ArgumentException("attempt to access a deleted document");
return fieldsReader.Doc(n, fieldSelector);
}
}
public override bool IsDeleted(int n)
{
lock (this)
{
return (deletedDocs != null && deletedDocs.Get(n));
}
}
public override TermDocs TermDocs()
{
return new SegmentTermDocs(this);
}
public override TermPositions TermPositions()
{
return new SegmentTermPositions(this);
}
public override int DocFreq(Term t)
{
TermInfo ti = tis.Get(t);
if (ti != null)
return ti.docFreq;
else
return 0;
}
public override int NumDocs()
{
int n = MaxDoc();
if (deletedDocs != null)
n -= deletedDocs.Count();
return n;
}
public override int MaxDoc()
{
return si.docCount;
}
/// <seealso cref="fldOption)">
/// </seealso>
public override System.Collections.ICollection GetFieldNames(IndexReader.FieldOption fieldOption)
{
System.Collections.Hashtable fieldSet = new System.Collections.Hashtable();
for (int i = 0; i < fieldInfos.Size(); i++)
{
FieldInfo fi = fieldInfos.FieldInfo(i);
if (fieldOption == IndexReader.FieldOption.ALL)
{
fieldSet.Add(fi.name, fi.name);
}
else if (!fi.isIndexed && fieldOption == IndexReader.FieldOption.UNINDEXED)
{
fieldSet.Add(fi.name, fi.name);
}
else if (fi.isIndexed && fieldOption == IndexReader.FieldOption.INDEXED)
{
fieldSet.Add(fi.name, fi.name);
}
else if (fi.isIndexed && fi.storeTermVector == false && fieldOption == IndexReader.FieldOption.INDEXED_NO_TERMVECTOR)
{
fieldSet.Add(fi.name, fi.name);
}
else if (fi.storeTermVector == true && fi.storePositionWithTermVector == false && fi.storeOffsetWithTermVector == false && fieldOption == IndexReader.FieldOption.TERMVECTOR)
{
fieldSet.Add(fi.name, fi.name);
}
else if (fi.isIndexed && fi.storeTermVector && fieldOption == IndexReader.FieldOption.INDEXED_WITH_TERMVECTOR)
{
fieldSet.Add(fi.name, fi.name);
}
else if (fi.storePositionWithTermVector && fi.storeOffsetWithTermVector == false && fieldOption == IndexReader.FieldOption.TERMVECTOR_WITH_POSITION)
{
fieldSet.Add(fi.name, fi.name);
}
else if (fi.storeOffsetWithTermVector && fi.storePositionWithTermVector == false && fieldOption == IndexReader.FieldOption.TERMVECTOR_WITH_OFFSET)
{
fieldSet.Add(fi.name, fi.name);
}
else if ((fi.storeOffsetWithTermVector && fi.storePositionWithTermVector) && fieldOption == IndexReader.FieldOption.TERMVECTOR_WITH_POSITION_OFFSET)
{
fieldSet.Add(fi.name, fi.name);
}
}
return fieldSet;
}
public override bool HasNorms(System.String field)
{
lock (this)
{
return norms.ContainsKey(field);
}
}
internal static byte[] CreateFakeNorms(int size)
{
byte[] ones = new byte[size];
byte val = DefaultSimilarity.EncodeNorm(1.0f);
for (int index = 0; index < size; index++)
ones[index] = val;
return ones;
}
private byte[] ones;
private byte[] FakeNorms()
{
if (ones == null)
ones = CreateFakeNorms(MaxDoc());
return ones;
}
// can return null if norms aren't stored
protected internal virtual byte[] GetNorms(System.String field)
{
lock (this)
{
Norm norm = (Norm) norms[field];
if (norm == null)
return null; // not indexed, or norms not stored
if (norm.bytes == null)
{
// value not yet read
byte[] bytes = new byte[MaxDoc()];
Norms(field, bytes, 0);
norm.bytes = bytes; // cache it
}
return norm.bytes;
}
}
// returns fake norms if norms aren't available
public override byte[] Norms(System.String field)
{
lock (this)
{
byte[] bytes = GetNorms(field);
if (bytes == null)
bytes = FakeNorms();
return bytes;
}
}
protected internal override void DoSetNorm(int doc, System.String field, byte value_Renamed)
{
Norm norm = (Norm) norms[field];
if (norm == null)
// not an indexed field
return ;
norm.dirty = true; // mark it dirty
normsDirty = true;
Norms(field)[doc] = value_Renamed; // set the value
}
/// <summary>Read norms into a pre-allocated array. </summary>
public override void Norms(System.String field, byte[] bytes, int offset)
{
lock (this)
{
Norm norm = (Norm) norms[field];
if (norm == null)
{
Array.Copy(FakeNorms(), 0, bytes, offset, MaxDoc());
return ;
}
if (norm.bytes != null)
{
// can copy from cache
Array.Copy(norm.bytes, 0, bytes, offset, MaxDoc());
return ;
}
IndexInput normStream = (IndexInput) norm.in_Renamed.Clone();
try
{
// read from disk
normStream.Seek(norm.normSeek);
normStream.ReadBytes(bytes, offset, MaxDoc());
}
finally
{
normStream.Close();
}
}
}
private void OpenNorms(Directory cfsDir)
{
long nextNormSeek = SegmentMerger.NORMS_HEADER.Length; //skip header (header unused for now)
int maxDoc = MaxDoc();
for (int i = 0; i < fieldInfos.Size(); i++)
{
FieldInfo fi = fieldInfos.FieldInfo(i);
if (fi.isIndexed && !fi.omitNorms)
{
Directory d = Directory();
System.String fileName = si.GetNormFileName(fi.number);
if (!si.HasSeparateNorms(fi.number))
{
d = cfsDir;
}
long normSeek = (fileName.EndsWith("." + IndexFileNames.NORMS_EXTENSION)?nextNormSeek:0);
norms[fi.name] = new Norm(this, d.OpenInput(fileName), fi.number, normSeek);
nextNormSeek += maxDoc; // increment also if some norms are separate
}
}
}
private void CloseNorms()
{
lock (norms.SyncRoot)
{
System.Collections.IEnumerator enumerator = norms.Values.GetEnumerator();
while (enumerator.MoveNext())
{
Norm norm = (Norm) enumerator.Current;
norm.in_Renamed.Close();
}
}
}
/// <summary> Create a clone from the initial TermVectorsReader and store it in the ThreadLocal.</summary>
/// <returns> TermVectorsReader
/// </returns>
private TermVectorsReader GetTermVectorsReader()
{
TermVectorsReader tvReader = (TermVectorsReader) System.Threading.Thread.GetData(termVectorsLocal);
if (tvReader == null)
{
tvReader = (TermVectorsReader) termVectorsReaderOrig.Clone();
System.Threading.Thread.SetData(termVectorsLocal, tvReader);
}
return tvReader;
}
/// <summary>Return a term frequency vector for the specified document and field. The
/// vector returned contains term numbers and frequencies for all terms in
/// the specified field of this document, if the field had storeTermVector
/// flag set. If the flag was not set, the method returns null.
/// </summary>
/// <throws> IOException </throws>
public override TermFreqVector GetTermFreqVector(int docNumber, System.String field)
{
// Check if this field is invalid or has no stored term vector
FieldInfo fi = fieldInfos.FieldInfo(field);
if (fi == null || !fi.storeTermVector || termVectorsReaderOrig == null)
return null;
TermVectorsReader termVectorsReader = GetTermVectorsReader();
if (termVectorsReader == null)
return null;
return termVectorsReader.Get(docNumber, field);
}
/// <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 vector contains term numbers and frequencies for all terms
/// in a given vectorized field.
/// If no such fields existed, the method returns null.
/// </summary>
/// <throws> IOException </throws>
public override TermFreqVector[] GetTermFreqVectors(int docNumber)
{
if (termVectorsReaderOrig == null)
return null;
TermVectorsReader termVectorsReader = GetTermVectorsReader();
if (termVectorsReader == null)
return null;
return termVectorsReader.Get(docNumber);
}
/// <summary> Return the name of the segment this reader is reading.</summary>
internal virtual System.String GetSegmentName()
{
return segment;
}
internal virtual void SetSegmentInfo(SegmentInfo info)
{
si = info;
}
internal override void StartCommit()
{
base.StartCommit();
rollbackDeletedDocsDirty = deletedDocsDirty;
rollbackNormsDirty = normsDirty;
rollbackUndeleteAll = undeleteAll;
System.Collections.IEnumerator values = norms.Values.GetEnumerator();
while (values.MoveNext())
{
Norm norm = (Norm) values.Current;
norm.rollbackDirty = norm.dirty;
}
}
internal override void RollbackCommit()
{
base.RollbackCommit();
deletedDocsDirty = rollbackDeletedDocsDirty;
normsDirty = rollbackNormsDirty;
undeleteAll = rollbackUndeleteAll;
System.Collections.IEnumerator values = norms.Values.GetEnumerator();
while (values.MoveNext())
{
Norm norm = (Norm) values.Current;
norm.dirty = norm.rollbackDirty;
}
}
static SegmentReader()
{
{
try
{
System.String name = SupportClass.AppSettings.Get("Lucene.Net.SegmentReader.class", typeof(SegmentReader).FullName);
IMPL = System.Type.GetType(name);
}
catch (System.Security.SecurityException se)
{
try
{
IMPL = System.Type.GetType(typeof(SegmentReader).FullName);
}
catch (System.Exception e)
{
throw new System.SystemException("cannot load default SegmentReader class: " + e, e);
}
}
catch (System.Exception e)
{
throw new System.SystemException("cannot load SegmentReader class: " + e, e);
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -