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

搜索引擎

开发平台:

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 IndexReader = Lucene.Net.Index.IndexReader;
  18. using Query = Lucene.Net.Search.Query;
  19. using ToStringUtils = Lucene.Net.Util.ToStringUtils;
  20. namespace Lucene.Net.Search.Spans
  21. {
  22. /// <summary>Matches spans near the beginning of a field. </summary>
  23. [Serializable]
  24. public class SpanFirstQuery : SpanQuery
  25. {
  26. private class AnonymousClassSpans : Spans
  27. {
  28. public AnonymousClassSpans(Lucene.Net.Index.IndexReader reader, SpanFirstQuery enclosingInstance)
  29. {
  30. InitBlock(reader, enclosingInstance);
  31. }
  32. private void  InitBlock(Lucene.Net.Index.IndexReader reader, SpanFirstQuery enclosingInstance)
  33. {
  34. this.reader = reader;
  35. this.enclosingInstance = enclosingInstance;
  36. spans = Enclosing_Instance.match.GetSpans(reader);
  37. }
  38. private Lucene.Net.Index.IndexReader reader;
  39. private SpanFirstQuery enclosingInstance;
  40. public SpanFirstQuery Enclosing_Instance
  41. {
  42. get
  43. {
  44. return enclosingInstance;
  45. }
  46. }
  47. private Spans spans;
  48. public virtual bool Next()
  49. {
  50. while (spans.Next())
  51. {
  52. // scan to next match
  53. if (End() <= Enclosing_Instance.end)
  54. return true;
  55. }
  56. return false;
  57. }
  58. public virtual bool SkipTo(int target)
  59. {
  60. if (!spans.SkipTo(target))
  61. return false;
  62. if (spans.End() <= Enclosing_Instance.end)
  63. // there is a match
  64. return true;
  65. return Next(); // scan to next match
  66. }
  67. public virtual int Doc()
  68. {
  69. return spans.Doc();
  70. }
  71. public virtual int Start()
  72. {
  73. return spans.Start();
  74. }
  75. public virtual int End()
  76. {
  77. return spans.End();
  78. }
  79. public override System.String ToString()
  80. {
  81. return "spans(" + Enclosing_Instance.ToString() + ")";
  82. }
  83. }
  84. private SpanQuery match;
  85. private int end;
  86. /// <summary>Construct a SpanFirstQuery matching spans in <code>match</code> whose end
  87. /// position is less than or equal to <code>end</code>. 
  88. /// </summary>
  89. public SpanFirstQuery(SpanQuery match, int end)
  90. {
  91. this.match = match;
  92. this.end = end;
  93. }
  94. /// <summary>Return the SpanQuery whose matches are filtered. </summary>
  95. public virtual SpanQuery GetMatch()
  96. {
  97. return match;
  98. }
  99. /// <summary>Return the maximum end position permitted in a match. </summary>
  100. public virtual int GetEnd()
  101. {
  102. return end;
  103. }
  104. public override System.String GetField()
  105. {
  106. return match.GetField();
  107. }
  108. public override System.Collections.ICollection GetTerms()
  109. {
  110. return match.GetTerms();
  111. }
  112. public override System.String ToString(System.String field)
  113. {
  114. System.Text.StringBuilder buffer = new System.Text.StringBuilder();
  115. buffer.Append("spanFirst(");
  116. buffer.Append(match.ToString(field));
  117. buffer.Append(", ");
  118. buffer.Append(end);
  119. buffer.Append(")");
  120. buffer.Append(ToStringUtils.Boost(GetBoost()));
  121. return buffer.ToString();
  122. }
  123. public override Spans GetSpans(IndexReader reader)
  124. {
  125. return new AnonymousClassSpans(reader, this);
  126. }
  127. public override Query Rewrite(IndexReader reader)
  128. {
  129. SpanFirstQuery clone = null;
  130. SpanQuery rewritten = (SpanQuery) match.Rewrite(reader);
  131. if (rewritten != match)
  132. {
  133. clone = (SpanFirstQuery) this.Clone();
  134. clone.match = rewritten;
  135. }
  136. if (clone != null)
  137. {
  138. return clone; // some clauses rewrote
  139. }
  140. else
  141. {
  142. return this; // no clauses rewrote
  143. }
  144. }
  145. }
  146. }