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

搜索引擎

开发平台:

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 ToStringUtils = Lucene.Net.Util.ToStringUtils;
  19. namespace Lucene.Net.Search
  20. {
  21. /// <summary> A query that applies a filter to the results of another query.
  22. /// 
  23. /// <p>Note: the bits are retrieved from the filter each time this
  24. /// query is used in a search - use a CachingWrapperFilter to avoid
  25. /// regenerating the bits every time.
  26. /// 
  27. /// <p>Created: Apr 20, 2004 8:58:29 AM
  28. /// 
  29. /// </summary>
  30. /// <author>   Tim Jones
  31. /// </author>
  32. /// <since>   1.4
  33. /// </since>
  34. /// <version>  $Id: FilteredQuery.java 331113 2005-11-06 15:55:45Z yonik $
  35. /// </version>
  36. /// <seealso cref="CachingWrapperFilter">
  37. /// </seealso>
  38. [Serializable]
  39. public class FilteredQuery:Query
  40. {
  41. [Serializable]
  42. private class AnonymousClassWeight : Weight
  43. {
  44. public AnonymousClassWeight(Lucene.Net.Search.Weight weight, Lucene.Net.Search.Similarity similarity, FilteredQuery enclosingInstance)
  45. {
  46. InitBlock(weight, similarity, enclosingInstance);
  47. }
  48. private class AnonymousClassScorer : Scorer
  49. {
  50. private void  InitBlock(Lucene.Net.Search.Scorer scorer, System.Collections.BitArray bitset, AnonymousClassWeight enclosingInstance)
  51. {
  52. this.scorer = scorer;
  53. this.bitset = bitset;
  54. this.enclosingInstance = enclosingInstance;
  55. }
  56. private Lucene.Net.Search.Scorer scorer;
  57. private System.Collections.BitArray bitset;
  58. private AnonymousClassWeight enclosingInstance;
  59. public AnonymousClassWeight Enclosing_Instance
  60. {
  61. get
  62. {
  63. return enclosingInstance;
  64. }
  65. }
  66. internal AnonymousClassScorer(Lucene.Net.Search.Scorer scorer, System.Collections.BitArray bitset, AnonymousClassWeight enclosingInstance, Lucene.Net.Search.Similarity Param1):base(Param1)
  67. {
  68. InitBlock(scorer, bitset, enclosingInstance);
  69. }
  70. // pass these methods through to the enclosed scorer
  71. public override bool Next()
  72. {
  73. return scorer.Next();
  74. }
  75. public override int Doc()
  76. {
  77. return scorer.Doc();
  78. }
  79. public override bool SkipTo(int i)
  80. {
  81. return scorer.SkipTo(i);
  82. }
  83. // if the document has been filtered out, set score to 0.0
  84. public override float Score()
  85. {
  86. return (bitset.Get(scorer.Doc()))?scorer.Score():0.0f;
  87. }
  88. // add an explanation about whether the document was filtered
  89. public override Explanation Explain(int i)
  90. {
  91. Explanation exp = scorer.Explain(i);
  92. if (bitset.Get(i))
  93. exp.SetDescription("allowed by filter: " + exp.GetDescription());
  94. else
  95. exp.SetDescription("removed by filter: " + exp.GetDescription());
  96. return exp;
  97. }
  98. }
  99. private void  InitBlock(Lucene.Net.Search.Weight weight, Lucene.Net.Search.Similarity similarity, FilteredQuery enclosingInstance)
  100. {
  101. this.weight = weight;
  102. this.similarity = similarity;
  103. this.enclosingInstance = enclosingInstance;
  104. }
  105. private Lucene.Net.Search.Weight weight;
  106. private Lucene.Net.Search.Similarity similarity;
  107. private FilteredQuery enclosingInstance;
  108. public FilteredQuery Enclosing_Instance
  109. {
  110. get
  111. {
  112. return enclosingInstance;
  113. }
  114. }
  115. // pass these methods through to enclosed query's weight
  116. public virtual float GetValue()
  117. {
  118. return weight.GetValue();
  119. }
  120. public virtual float SumOfSquaredWeights()
  121. {
  122. return weight.SumOfSquaredWeights();
  123. }
  124. public virtual void  Normalize(float v)
  125. {
  126. weight.Normalize(v);
  127. }
  128. public virtual Explanation Explain(IndexReader ir, int i)
  129. {
  130. return weight.Explain(ir, i);
  131. }
  132. // return this query
  133. public virtual Query GetQuery()
  134. {
  135. return Enclosing_Instance;
  136. }
  137. // return a scorer that overrides the enclosed query's score if
  138. // the given hit has been filtered out.
  139. public virtual Scorer Scorer(IndexReader indexReader)
  140. {
  141. Scorer scorer = weight.Scorer(indexReader);
  142. System.Collections.BitArray bitset = Enclosing_Instance.filter.Bits(indexReader);
  143. return new AnonymousClassScorer(scorer, bitset, this, similarity);
  144. }
  145. }
  146. internal Query query;
  147. internal Filter filter;
  148. /// <summary> Constructs a new query which applies a filter to the results of the original query.
  149. /// Filter.bits() will be called every time this query is used in a search.
  150. /// </summary>
  151. /// <param name="query"> Query to be filtered, cannot be <code>null</code>.
  152. /// </param>
  153. /// <param name="filter">Filter to apply to query results, cannot be <code>null</code>.
  154. /// </param>
  155. public FilteredQuery(Query query, Filter filter)
  156. {
  157. this.query = query;
  158. this.filter = filter;
  159. }
  160. /// <summary> Returns a Weight that applies the filter to the enclosed query's Weight.
  161. /// This is accomplished by overriding the Scorer returned by the Weight.
  162. /// </summary>
  163. protected internal override Weight CreateWeight(Searcher searcher)
  164. {
  165. Weight weight = query.CreateWeight(searcher);
  166. Similarity similarity = query.GetSimilarity(searcher);
  167. return new AnonymousClassWeight(weight, similarity, this);
  168. }
  169. /// <summary>Rewrites the wrapped query. </summary>
  170. public override Query Rewrite(IndexReader reader)
  171. {
  172. Query rewritten = query.Rewrite(reader);
  173. if (rewritten != query)
  174. {
  175. FilteredQuery clone = (FilteredQuery) this.Clone();
  176. clone.query = rewritten;
  177. return clone;
  178. }
  179. else
  180. {
  181. return this;
  182. }
  183. }
  184. public virtual Query GetQuery()
  185. {
  186. return query;
  187. }
  188. public virtual Filter GetFilter()
  189. {
  190. return filter;
  191. }
  192. // inherit javadoc
  193. public override void  ExtractTerms(System.Collections.Hashtable terms)
  194. {
  195. GetQuery().ExtractTerms(terms);
  196. }
  197. /// <summary>Prints a user-readable version of this query. </summary>
  198. public override System.String ToString(System.String s)
  199. {
  200. System.Text.StringBuilder buffer = new System.Text.StringBuilder();
  201. buffer.Append("filtered(");
  202. buffer.Append(query.ToString(s));
  203. buffer.Append(")->");
  204. buffer.Append(filter);
  205. buffer.Append(ToStringUtils.Boost(GetBoost()));
  206. return buffer.ToString();
  207. }
  208. /// <summary>Returns true iff <code>o</code> is equal to this. </summary>
  209. public  override bool Equals(System.Object o)
  210. {
  211. if (o is FilteredQuery)
  212. {
  213. FilteredQuery fq = (FilteredQuery) o;
  214. return (query.Equals(fq.query) && filter.Equals(fq.filter));
  215. }
  216. return false;
  217. }
  218. /// <summary>Returns a hash code value for this object. </summary>
  219. public override int GetHashCode()
  220. {
  221. return query.GetHashCode() ^ filter.GetHashCode();
  222. }
  223.         // {{Aroush-1.9}} Do we need this Clone() method?!
  224. override public System.Object Clone()
  225. {
  226. return null;
  227. }
  228. }
  229. }