FieldsReader.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:6k
源码类别:

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2004 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. using Document = Lucene.Net.Documents.Document;
  18. using Field = Lucene.Net.Documents.Field;
  19. using Directory = Lucene.Net.Store.Directory;
  20. using IndexInput = Lucene.Net.Store.IndexInput;
  21. namespace Lucene.Net.Index
  22. {
  23. /// <summary> Class responsible for access to stored document fields.
  24. /// 
  25. /// It uses &lt;segment&gt;.fdt and &lt;segment&gt;.fdx; files.
  26. /// 
  27. /// </summary>
  28. /// <version>  $Id: FieldsReader.java 329524 2005-10-30 05:38:46Z yonik $
  29. /// </version>
  30. public sealed class FieldsReader
  31. {
  32. private FieldInfos fieldInfos;
  33. private IndexInput fieldsStream;
  34. private IndexInput indexStream;
  35. private int size;
  36. public /*internal*/ FieldsReader(Directory d, System.String segment, FieldInfos fn)
  37. {
  38. fieldInfos = fn;
  39. fieldsStream = d.OpenInput(segment + ".fdt");
  40. indexStream = d.OpenInput(segment + ".fdx");
  41. size = (int) (indexStream.Length() / 8);
  42. }
  43. public /*internal*/ void  Close()
  44. {
  45. fieldsStream.Close();
  46. indexStream.Close();
  47. }
  48. public /*internal*/ int Size()
  49. {
  50. return size;
  51. }
  52. public /*internal*/ Document Doc(int n)
  53. {
  54. indexStream.Seek(n * 8L);
  55. long position = indexStream.ReadLong();
  56. fieldsStream.Seek(position);
  57. Document doc = new Document();
  58. int numFields = fieldsStream.ReadVInt();
  59. for (int i = 0; i < numFields; i++)
  60. {
  61. int fieldNumber = fieldsStream.ReadVInt();
  62. FieldInfo fi = fieldInfos.FieldInfo(fieldNumber);
  63. byte bits = fieldsStream.ReadByte();
  64. bool compressed = (bits & FieldsWriter.FIELD_IS_COMPRESSED) != 0;
  65. bool tokenize = (bits & FieldsWriter.FIELD_IS_TOKENIZED) != 0;
  66. if ((bits & FieldsWriter.FIELD_IS_BINARY) != 0)
  67. {
  68. byte[] b = new byte[fieldsStream.ReadVInt()];
  69. fieldsStream.ReadBytes(b, 0, b.Length);
  70. if (compressed)
  71. doc.Add(new Field(fi.name, Uncompress(b), Field.Store.COMPRESS));
  72. else
  73. doc.Add(new Field(fi.name, b, Field.Store.YES));
  74. }
  75. else
  76. {
  77. Field.Index index;
  78. Field.Store store = Field.Store.YES;
  79. if (fi.isIndexed && tokenize)
  80. index = Field.Index.TOKENIZED;
  81. else if (fi.isIndexed && !tokenize)
  82. index = Field.Index.UN_TOKENIZED;
  83. else
  84. index = Field.Index.NO;
  85. Field.TermVector termVector = null;
  86. if (fi.storeTermVector)
  87. {
  88. if (fi.storeOffsetWithTermVector)
  89. {
  90. if (fi.storePositionWithTermVector)
  91. {
  92. termVector = Field.TermVector.WITH_POSITIONS_OFFSETS;
  93. }
  94. else
  95. {
  96. termVector = Field.TermVector.WITH_OFFSETS;
  97. }
  98. }
  99. else if (fi.storePositionWithTermVector)
  100. {
  101. termVector = Field.TermVector.WITH_POSITIONS;
  102. }
  103. else
  104. {
  105. termVector = Field.TermVector.YES;
  106. }
  107. }
  108. else
  109. {
  110. termVector = Field.TermVector.NO;
  111. }
  112. if (compressed)
  113. {
  114. store = Field.Store.COMPRESS;
  115. byte[] b = new byte[fieldsStream.ReadVInt()];
  116. fieldsStream.ReadBytes(b, 0, b.Length);
  117. Field f = new Field(fi.name, System.Text.Encoding.GetEncoding("UTF-8").GetString(Uncompress(b)), store, index, termVector);
  118. f.SetOmitNorms(fi.omitNorms);
  119. doc.Add(f);
  120. }
  121. else
  122. {
  123. Field f = new Field(fi.name, fieldsStream.ReadString(), store, index, termVector);
  124. f.SetOmitNorms(fi.omitNorms);
  125. doc.Add(f);
  126. }
  127. }
  128. }
  129. return doc;
  130. }
  131. private byte[] Uncompress(byte[] input)
  132. {
  133.             // {{Aroush-1.9}} for .NET 1.1, we can use reflection and ZLib?
  134.             return input;
  135.             /*
  136. //UPGRADE_ISSUE: Class 'java.util.zip.Inflater' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javautilzipInflater'"
  137. //UPGRADE_ISSUE: Constructor 'java.util.zip.Inflater.Inflater' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javautilzipInflater'"
  138. Inflater decompressor = new Inflater();
  139. //UPGRADE_ISSUE: Method 'java.util.zip.Inflater.setInput' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javautilzipInflater'"
  140. decompressor.setInput(input);
  141. // Create an expandable byte array to hold the decompressed data
  142. System.IO.MemoryStream bos = new System.IO.MemoryStream(input.Length);
  143. // Decompress the data
  144. byte[] buf = new byte[1024];
  145. //UPGRADE_ISSUE: Method 'java.util.zip.Inflater.finished' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javautilzipInflater'"
  146. while (!decompressor.finished())
  147. {
  148. try
  149. {
  150. //UPGRADE_ISSUE: Method 'java.util.zip.Inflater.inflate' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javautilzipInflater'"
  151. int count = decompressor.inflate(buf);
  152. bos.Write(SupportClass.ToByteArray(buf), 0, count);
  153. }
  154. catch (Exception e)
  155. {
  156. // this will happen if the field is not compressed
  157. throw new System.IO.IOException("field data are in wrong format: " + e.ToString());
  158. }
  159. }
  160. //UPGRADE_ISSUE: Method 'java.util.zip.Inflater.end' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javautilzipInflater'"
  161. decompressor.end();
  162. // Get the decompressed data
  163. return SupportClass.ToSByteArray(bos.ToArray());
  164.             */
  165. }
  166. }
  167. }