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

搜索引擎

开发平台:

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. using IndexOutput = Lucene.Net.Store.IndexOutput;
  22. namespace Lucene.Net.Index
  23. {
  24. /// <summary>Access to the Field Info file that describes document fields and whether or
  25. /// not they are indexed. Each segment has a separate Field Info file. Objects
  26. /// of this class are thread-safe for multiple readers, but only one thread can
  27. /// be adding documents at a time, with no other reader or writer threads
  28. /// accessing this object.
  29. /// </summary>
  30. public sealed class FieldInfos
  31. {
  32. internal const byte IS_INDEXED = (byte) (0x1);
  33. internal const byte STORE_TERMVECTOR = (byte) (0x2);
  34. internal const byte STORE_POSITIONS_WITH_TERMVECTOR = (byte) (0x4);
  35. internal const byte STORE_OFFSET_WITH_TERMVECTOR = (byte) (0x8);
  36. internal const byte OMIT_NORMS = (byte) (0x10);
  37. private System.Collections.ArrayList byNumber = new System.Collections.ArrayList();
  38. private System.Collections.Hashtable byName = new System.Collections.Hashtable();
  39. public /*internal*/ FieldInfos()
  40. {
  41. }
  42. /// <summary> Construct a FieldInfos object using the directory and the name of the file
  43. /// IndexInput
  44. /// </summary>
  45. /// <param name="d">The directory to open the IndexInput from
  46. /// </param>
  47. /// <param name="name">The name of the file to open the IndexInput from in the Directory
  48. /// </param>
  49. /// <throws>  IOException </throws>
  50. public /*internal*/ FieldInfos(Directory d, System.String name)
  51. {
  52. IndexInput input = d.OpenInput(name);
  53. try
  54. {
  55. Read(input);
  56. }
  57. finally
  58. {
  59. input.Close();
  60. }
  61. }
  62. /// <summary>Adds field info for a Document. </summary>
  63. public void  Add(Document doc)
  64. {
  65. System.Collections.IEnumerator fields = doc.Fields();
  66. while (fields.MoveNext())
  67. {
  68. Field field = (Field) fields.Current;
  69. Add(field.Name(), field.IsIndexed(), field.IsTermVectorStored(), field.IsStorePositionWithTermVector(), field.IsStoreOffsetWithTermVector(), field.GetOmitNorms());
  70. }
  71. }
  72. /// <summary> Add fields that are indexed. Whether they have termvectors has to be specified.
  73. /// 
  74. /// </summary>
  75. /// <param name="names">The names of the fields
  76. /// </param>
  77. /// <param name="storeTermVectors">Whether the fields store term vectors or not
  78. /// </param>
  79. /// <param name="storePositionWithTermVector">treu if positions should be stored.
  80. /// </param>
  81. /// <param name="storeOffsetWithTermVector">true if offsets should be stored
  82. /// </param>
  83. public void  AddIndexed(System.Collections.ICollection names, bool storeTermVectors, bool storePositionWithTermVector, bool storeOffsetWithTermVector)
  84. {
  85. System.Collections.IEnumerator i = names.GetEnumerator();
  86. while (i.MoveNext())
  87. {
  88. System.Collections.DictionaryEntry t = (System.Collections.DictionaryEntry) i.Current;
  89. Add((System.String) t.Key, true, storeTermVectors, storePositionWithTermVector, storeOffsetWithTermVector);
  90. }
  91. }
  92. /// <summary> Assumes the fields are not storing term vectors.
  93. /// 
  94. /// </summary>
  95. /// <param name="names">The names of the fields
  96. /// </param>
  97. /// <param name="isIndexed">Whether the fields are indexed or not
  98. /// 
  99. /// </param>
  100. /// <seealso cref="Add(String, boolean)">
  101. /// </seealso>
  102. public void  Add(System.Collections.ICollection names, bool isIndexed)
  103. {
  104. System.Collections.IEnumerator i = names.GetEnumerator();
  105. while (i.MoveNext())
  106. {
  107. System.Collections.DictionaryEntry t = (System.Collections.DictionaryEntry) i.Current;
  108. Add((System.String) t.Key, isIndexed);
  109. }
  110. }
  111. /// <summary> Calls 5 parameter add with false for all TermVector parameters.
  112. /// 
  113. /// </summary>
  114. /// <param name="name">The name of the Field
  115. /// </param>
  116. /// <param name="isIndexed">true if the field is indexed
  117. /// </param>
  118. /// <seealso cref="Add(String, boolean, boolean, boolean, boolean)">
  119. /// </seealso>
  120. public void  Add(System.String name, bool isIndexed)
  121. {
  122. Add(name, isIndexed, false, false, false, false);
  123. }
  124. /// <summary> Calls 5 parameter add with false for term vector positions and offsets.
  125. /// 
  126. /// </summary>
  127. /// <param name="name">The name of the field
  128. /// </param>
  129. /// <param name="isIndexed"> true if the field is indexed
  130. /// </param>
  131. /// <param name="storeTermVector">true if the term vector should be stored
  132. /// </param>
  133. public void  Add(System.String name, bool isIndexed, bool storeTermVector)
  134. {
  135. Add(name, isIndexed, storeTermVector, false, false, false);
  136. }
  137. /// <summary>If the field is not yet known, adds it. If it is known, checks to make
  138. /// sure that the isIndexed flag is the same as was given previously for this
  139. /// field. If not - marks it as being indexed.  Same goes for the TermVector
  140. /// parameters.
  141. /// 
  142. /// </summary>
  143. /// <param name="name">The name of the field
  144. /// </param>
  145. /// <param name="isIndexed">true if the field is indexed
  146. /// </param>
  147. /// <param name="storeTermVector">true if the term vector should be stored
  148. /// </param>
  149. /// <param name="storePositionWithTermVector">true if the term vector with positions should be stored
  150. /// </param>
  151. /// <param name="storeOffsetWithTermVector">true if the term vector with offsets should be stored
  152. /// </param>
  153. public void  Add(System.String name, bool isIndexed, bool storeTermVector, bool storePositionWithTermVector, bool storeOffsetWithTermVector)
  154. {
  155. Add(name, isIndexed, storeTermVector, storePositionWithTermVector, storeOffsetWithTermVector, false);
  156. }
  157. /// <summary>If the field is not yet known, adds it. If it is known, checks to make
  158. /// sure that the isIndexed flag is the same as was given previously for this
  159. /// field. If not - marks it as being indexed.  Same goes for the TermVector
  160. /// parameters.
  161. /// 
  162. /// </summary>
  163. /// <param name="name">The name of the field
  164. /// </param>
  165. /// <param name="isIndexed">true if the field is indexed
  166. /// </param>
  167. /// <param name="storeTermVector">true if the term vector should be stored
  168. /// </param>
  169. /// <param name="storePositionWithTermVector">true if the term vector with positions should be stored
  170. /// </param>
  171. /// <param name="storeOffsetWithTermVector">true if the term vector with offsets should be stored
  172. /// </param>
  173. /// <param name="omitNorms">true if the norms for the indexed field should be omitted
  174. /// </param>
  175. public void  Add(System.String name, bool isIndexed, bool storeTermVector, bool storePositionWithTermVector, bool storeOffsetWithTermVector, bool omitNorms)
  176. {
  177. FieldInfo fi = FieldInfo(name);
  178. if (fi == null)
  179. {
  180. AddInternal(name, isIndexed, storeTermVector, storePositionWithTermVector, storeOffsetWithTermVector, omitNorms);
  181. }
  182. else
  183. {
  184. if (fi.isIndexed != isIndexed)
  185. {
  186. fi.isIndexed = true; // once indexed, always index
  187. }
  188. if (fi.storeTermVector != storeTermVector)
  189. {
  190. fi.storeTermVector = true; // once vector, always vector
  191. }
  192. if (fi.storePositionWithTermVector != storePositionWithTermVector)
  193. {
  194. fi.storePositionWithTermVector = true; // once vector, always vector
  195. }
  196. if (fi.storeOffsetWithTermVector != storeOffsetWithTermVector)
  197. {
  198. fi.storeOffsetWithTermVector = true; // once vector, always vector
  199. }
  200. if (fi.omitNorms != omitNorms)
  201. {
  202. fi.omitNorms = false; // once norms are stored, always store
  203. }
  204. }
  205. }
  206. private void  AddInternal(System.String name, bool isIndexed, bool storeTermVector, bool storePositionWithTermVector, bool storeOffsetWithTermVector, bool omitNorms)
  207. {
  208. FieldInfo fi = new FieldInfo(name, isIndexed, byNumber.Count, storeTermVector, storePositionWithTermVector, storeOffsetWithTermVector, omitNorms);
  209. byNumber.Add(fi);
  210. byName[name] = fi;
  211. }
  212. public int FieldNumber(System.String fieldName)
  213. {
  214. try
  215. {
  216. FieldInfo fi = FieldInfo(fieldName);
  217. if (fi != null)
  218. return fi.number;
  219. }
  220. catch (System.IndexOutOfRangeException ioobe)
  221. {
  222. return - 1;
  223. }
  224. return - 1;
  225. }
  226. public FieldInfo FieldInfo(System.String fieldName)
  227. {
  228. return (FieldInfo) byName[fieldName];
  229. }
  230. /// <summary> Return the fieldName identified by its number.
  231. /// 
  232. /// </summary>
  233. /// <param name="fieldNumber">
  234. /// </param>
  235. /// <returns> the fieldName or an empty string when the field
  236. /// with the given number doesn't exist.
  237. /// </returns>
  238. public System.String FieldName(int fieldNumber)
  239. {
  240. try
  241. {
  242. return FieldInfo(fieldNumber).name;
  243. }
  244. catch (System.NullReferenceException)
  245. {
  246. return "";
  247. }
  248. }
  249. /// <summary> Return the fieldinfo object referenced by the fieldNumber.</summary>
  250. /// <param name="fieldNumber">
  251. /// </param>
  252. /// <returns> the FieldInfo object or null when the given fieldNumber
  253. /// doesn't exist.
  254. /// </returns>
  255. public FieldInfo FieldInfo(int fieldNumber)
  256. {
  257. try
  258. {
  259. return (FieldInfo) byNumber[fieldNumber];
  260. }
  261. catch (System.ArgumentOutOfRangeException) // (System.IndexOutOfRangeException)
  262. {
  263. return null;
  264. }
  265. }
  266. public int Size()
  267. {
  268. return byNumber.Count;
  269. }
  270. public bool HasVectors()
  271. {
  272. bool hasVectors = false;
  273. for (int i = 0; i < Size(); i++)
  274. {
  275. if (FieldInfo(i).storeTermVector)
  276. {
  277. hasVectors = true;
  278. break;
  279. }
  280. }
  281. return hasVectors;
  282. }
  283. public void  Write(Directory d, System.String name)
  284. {
  285. IndexOutput output = d.CreateOutput(name);
  286. try
  287. {
  288. Write(output);
  289. }
  290. finally
  291. {
  292. output.Close();
  293. }
  294. }
  295. public void  Write(IndexOutput output)
  296. {
  297. output.WriteVInt(Size());
  298. for (int i = 0; i < Size(); i++)
  299. {
  300. FieldInfo fi = FieldInfo(i);
  301. byte bits = (byte) (0x0);
  302. if (fi.isIndexed)
  303. bits |= IS_INDEXED;
  304. if (fi.storeTermVector)
  305. bits |= STORE_TERMVECTOR;
  306. if (fi.storePositionWithTermVector)
  307. bits |= STORE_POSITIONS_WITH_TERMVECTOR;
  308. if (fi.storeOffsetWithTermVector)
  309. bits |= STORE_OFFSET_WITH_TERMVECTOR;
  310. if (fi.omitNorms)
  311. bits |= OMIT_NORMS;
  312. output.WriteString(fi.name);
  313. output.WriteByte(bits);
  314. }
  315. }
  316. private void  Read(IndexInput input)
  317. {
  318. int size = input.ReadVInt(); //read in the size
  319. for (int i = 0; i < size; i++)
  320. {
  321. System.String name = String.Intern(input.ReadString());
  322. byte bits = input.ReadByte();
  323. bool isIndexed = (bits & IS_INDEXED) != 0;
  324. bool storeTermVector = (bits & STORE_TERMVECTOR) != 0;
  325. bool storePositionsWithTermVector = (bits & STORE_POSITIONS_WITH_TERMVECTOR) != 0;
  326. bool storeOffsetWithTermVector = (bits & STORE_OFFSET_WITH_TERMVECTOR) != 0;
  327. bool omitNorms = (bits & OMIT_NORMS) != 0;
  328. AddInternal(name, isIndexed, storeTermVector, storePositionsWithTermVector, storeOffsetWithTermVector, omitNorms);
  329. }
  330. }
  331. }
  332. }