TermInfosWriter.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 Directory = Lucene.Net.Store.Directory;
  18. using IndexOutput = Lucene.Net.Store.IndexOutput;
  19. using StringHelper = Lucene.Net.Util.StringHelper;
  20. namespace Lucene.Net.Index
  21. {
  22. /// <summary>This stores a monotonically increasing set of <Term, TermInfo> pairs in a
  23. /// Directory.  A TermInfos can be written once, in order.  
  24. /// </summary>
  25. public sealed class TermInfosWriter
  26. {
  27. /// <summary>The file format version, a negative number. </summary>
  28. public const int FORMAT = - 2;
  29. private FieldInfos fieldInfos;
  30. private IndexOutput output;
  31. private Term lastTerm = new Term("", "");
  32. private TermInfo lastTi = new TermInfo();
  33. private long size = 0;
  34. // TODO: the default values for these two parameters should be settable from
  35. // IndexWriter.  However, once that's done, folks will start setting them to
  36. // ridiculous values and complaining that things don't work well, as with
  37. // mergeFactor.  So, let's wait until a number of folks find that alternate
  38. // values work better.  Note that both of these values are stored in the
  39. // segment, so that it's safe to change these w/o rebuilding all indexes.
  40. /// <summary>Expert: The fraction of terms in the "dictionary" which should be stored
  41. /// in RAM.  Smaller values use more memory, but make searching slightly
  42. /// faster, while larger values use less memory and make searching slightly
  43. /// slower.  Searching is typically not dominated by dictionary lookup, so
  44. /// tweaking this is rarely useful.
  45. /// </summary>
  46. internal int indexInterval = 128;
  47. /// <summary>Expert: The fraction of {@link TermDocs} entries stored in skip tables,
  48. /// used to accellerate {@link TermDocs#SkipTo(int)}.  Larger values result in
  49. /// smaller indexes, greater acceleration, but fewer accelerable cases, while
  50. /// smaller values result in bigger indexes, less acceleration and more
  51. /// accelerable cases. More detailed experiments would be useful here. 
  52. /// </summary>
  53. internal int skipInterval = 16;
  54. private long lastIndexPointer = 0;
  55. private bool isIndex = false;
  56. private TermInfosWriter other = null;
  57. public /*internal*/ TermInfosWriter(Directory directory, System.String segment, FieldInfos fis, int interval)
  58. {
  59. Initialize(directory, segment, fis, interval, false);
  60. other = new TermInfosWriter(directory, segment, fis, interval, true);
  61. other.other = this;
  62. }
  63. private TermInfosWriter(Directory directory, System.String segment, FieldInfos fis, int interval, bool isIndex)
  64. {
  65. Initialize(directory, segment, fis, interval, isIndex);
  66. }
  67. private void  Initialize(Directory directory, System.String segment, FieldInfos fis, int interval, bool isi)
  68. {
  69. indexInterval = interval;
  70. fieldInfos = fis;
  71. isIndex = isi;
  72. output = directory.CreateOutput(segment + (isIndex ? ".tii" : ".tis"));
  73. output.WriteInt(FORMAT); // write format
  74. output.WriteLong(0); // leave space for size
  75. output.WriteInt(indexInterval); // write indexInterval
  76. output.WriteInt(skipInterval); // write skipInterval
  77. }
  78. /// <summary>Adds a new <Term, TermInfo> pair to the set.
  79. /// Term must be lexicographically greater than all previous Terms added.
  80. /// TermInfo pointers must be positive and greater than all previous.
  81. /// </summary>
  82. public /*internal*/ void  Add(Term term, TermInfo ti)
  83. {
  84. if (!isIndex && term.CompareTo(lastTerm) <= 0)
  85. throw new System.IO.IOException("term out of order");
  86. if (ti.freqPointer < lastTi.freqPointer)
  87. throw new System.IO.IOException("freqPointer out of order");
  88. if (ti.proxPointer < lastTi.proxPointer)
  89. throw new System.IO.IOException("proxPointer out of order");
  90. if (!isIndex && size % indexInterval == 0)
  91. other.Add(lastTerm, lastTi); // add an index term
  92. WriteTerm(term); // write term
  93. output.WriteVInt(ti.docFreq); // write doc freq
  94. output.WriteVLong(ti.freqPointer - lastTi.freqPointer); // write pointers
  95. output.WriteVLong(ti.proxPointer - lastTi.proxPointer);
  96. if (ti.docFreq >= skipInterval)
  97. {
  98. output.WriteVInt(ti.skipOffset);
  99. }
  100. if (isIndex)
  101. {
  102. output.WriteVLong(other.output.GetFilePointer() - lastIndexPointer);
  103. lastIndexPointer = other.output.GetFilePointer(); // write pointer
  104. }
  105. lastTi.Set(ti);
  106. size++;
  107. }
  108. private void  WriteTerm(Term term)
  109. {
  110. int start = StringHelper.StringDifference(lastTerm.text, term.text);
  111. int length = term.text.Length - start;
  112. output.WriteVInt(start); // write shared prefix length
  113. output.WriteVInt(length); // write delta length
  114. output.WriteChars(term.text, start, length); // write delta chars
  115. output.WriteVInt(fieldInfos.FieldNumber(term.field)); // write field num
  116. lastTerm = term;
  117. }
  118. /// <summary>Called to complete TermInfos creation. </summary>
  119. public /*internal*/ void  Close()
  120. {
  121. output.Seek(4); // write size after format
  122. output.WriteLong(size);
  123. output.Close();
  124. if (!isIndex)
  125. other.Close();
  126. }
  127. }
  128. }