ConstantScoreQuery.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 IndexReader = Lucene.Net.Index.IndexReader;
  18. namespace Lucene.Net.Search
  19. {
  20. /// <summary> A query that wraps a filter and simply returns a constant score equal to the
  21. /// query boost for every document in the filter.
  22. /// 
  23. /// </summary>
  24. /// <author>  yonik
  25. /// </author>
  26. /// <version>  $Id$
  27. /// </version>
  28. [Serializable]
  29. public class ConstantScoreQuery : Query
  30. {
  31. protected internal Filter filter;
  32. public ConstantScoreQuery(Filter filter)
  33. {
  34. this.filter = filter;
  35. }
  36. public override Query Rewrite(IndexReader reader)
  37. {
  38. return this;
  39. }
  40. [Serializable]
  41. protected internal class ConstantWeight : Weight
  42. {
  43. private void  InitBlock(ConstantScoreQuery enclosingInstance)
  44. {
  45. this.enclosingInstance = enclosingInstance;
  46. }
  47. private ConstantScoreQuery enclosingInstance;
  48. public ConstantScoreQuery Enclosing_Instance
  49. {
  50. get
  51. {
  52. return enclosingInstance;
  53. }
  54. }
  55. private Searcher searcher;
  56. private float queryNorm;
  57. private float queryWeight;
  58. public ConstantWeight(ConstantScoreQuery enclosingInstance, Searcher searcher)
  59. {
  60. InitBlock(enclosingInstance);
  61. this.searcher = searcher;
  62. }
  63. public virtual Query GetQuery()
  64. {
  65. return Enclosing_Instance;
  66. }
  67. public virtual float GetValue()
  68. {
  69. return queryWeight;
  70. }
  71. public virtual float SumOfSquaredWeights()
  72. {
  73. queryWeight = Enclosing_Instance.GetBoost();
  74. return queryWeight * queryWeight;
  75. }
  76. public virtual void  Normalize(float norm)
  77. {
  78. this.queryNorm = norm;
  79. queryWeight *= this.queryNorm;
  80. }
  81. public virtual Scorer Scorer(IndexReader reader)
  82. {
  83. return new ConstantScorer(enclosingInstance, Enclosing_Instance.GetSimilarity(searcher), reader, this);
  84. }
  85. public virtual Explanation Explain(IndexReader reader, int doc)
  86. {
  87. ConstantScorer cs = (ConstantScorer) Scorer(reader);
  88. bool exists = cs.bits.Get(doc);
  89. Explanation result = new Explanation();
  90. if (exists)
  91. {
  92. result.SetDescription("ConstantScoreQuery(" + Enclosing_Instance.filter + "), product of:");
  93. result.SetValue(queryWeight);
  94. result.AddDetail(new Explanation(Enclosing_Instance.GetBoost(), "boost"));
  95. result.AddDetail(new Explanation(queryNorm, "queryNorm"));
  96. }
  97. else
  98. {
  99. result.SetDescription("ConstantScoreQuery(" + Enclosing_Instance.filter + ") doesn't match id " + doc);
  100. result.SetValue(0);
  101. }
  102. return result;
  103. }
  104. }
  105. protected internal class ConstantScorer : Scorer
  106. {
  107. private void  InitBlock(ConstantScoreQuery enclosingInstance)
  108. {
  109. this.enclosingInstance = enclosingInstance;
  110. }
  111. private ConstantScoreQuery enclosingInstance;
  112. public ConstantScoreQuery Enclosing_Instance
  113. {
  114. get
  115. {
  116. return enclosingInstance;
  117. }
  118. }
  119. internal System.Collections.BitArray bits;
  120. internal float theScore;
  121. internal int doc = - 1;
  122. public ConstantScorer(ConstantScoreQuery enclosingInstance, Similarity similarity, IndexReader reader, Weight w) : base(similarity)
  123. {
  124. InitBlock(enclosingInstance);
  125. theScore = w.GetValue();
  126. bits = Enclosing_Instance.filter.Bits(reader);
  127. }
  128. public override bool Next()
  129. {
  130. doc = SupportClass.Number.NextSetBit(bits, doc + 1);
  131. return doc >= 0;
  132. }
  133. public override int Doc()
  134. {
  135. return doc;
  136. }
  137. public override float Score()
  138. {
  139. return theScore;
  140. }
  141. public override bool SkipTo(int target)
  142. {
  143. doc = SupportClass.Number.NextSetBit(bits, target); // requires JDK 1.4
  144. return doc >= 0;
  145. }
  146. public override Explanation Explain(int doc)
  147. {
  148. throw new System.NotSupportedException();
  149. }
  150. }
  151. protected internal override Weight CreateWeight(Searcher searcher)
  152. {
  153. return new ConstantScoreQuery.ConstantWeight(this, searcher);
  154. }
  155. /// <summary>Prints a user-readable version of this query. </summary>
  156. public override System.String ToString(System.String field)
  157. {
  158. return "ConstantScore(" + filter.ToString() + (GetBoost() == 1.0 ? ")" : "^" + GetBoost());
  159. }
  160. /// <summary>Returns true if <code>o</code> is equal to this. </summary>
  161. public  override bool Equals(System.Object o)
  162. {
  163. if (this == o)
  164. return true;
  165. if (!(o is ConstantScoreQuery))
  166. return false;
  167. ConstantScoreQuery other = (ConstantScoreQuery) o;
  168. return this.GetBoost() == other.GetBoost() && filter.Equals(other.filter);
  169. }
  170. /// <summary>Returns a hash code value for this object. </summary>
  171. public override int GetHashCode()
  172. {
  173. // Simple add is OK since no existing filter hashcode has a float component.
  174. return filter.GetHashCode() + BitConverter.ToInt32(BitConverter.GetBytes(GetBoost()), 0);
  175. }
  176.         override public System.Object Clone()
  177. {
  178.             // {{Aroush-1.9}} is this all that we need to clone?!
  179.             ConstantScoreQuery clone = (ConstantScoreQuery) base.Clone();
  180.             clone.filter = (Filter) this.filter;
  181.             return clone;
  182.         }
  183. }
  184. }