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

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2002-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>The abstract base class for queries.
  21. /// <p>Instantiable subclasses are:
  22. /// <ul>
  23. /// <li> {@link TermQuery}
  24. /// <li> {@link MultiTermQuery}
  25. /// <li> {@link BooleanQuery}
  26. /// <li> {@link WildcardQuery}
  27. /// <li> {@link PhraseQuery}
  28. /// <li> {@link PrefixQuery}
  29. /// <li> {@link MultiPhraseQuery}
  30. /// <li> {@link FuzzyQuery}
  31. /// <li> {@link RangeQuery}
  32. /// <li> {@link Lucene.Net.search.spans.SpanQuery}
  33. /// </ul>
  34. /// <p>A parser for queries is contained in:
  35. /// <ul>
  36. /// <li>{@link Lucene.Net.queryParser.QueryParser QueryParser}
  37. /// </ul>
  38. /// </summary>
  39. [Serializable]
  40. public abstract class Query : System.ICloneable
  41. {
  42. private float boost = 1.0f; // query boost factor
  43. /// <summary>Sets the boost for this query clause to <code>b</code>.  Documents
  44. /// matching this clause will (in addition to the normal weightings) have
  45. /// their score multiplied by <code>b</code>.
  46. /// </summary>
  47. public virtual void  SetBoost(float b)
  48. {
  49. boost = b;
  50. }
  51. /// <summary>Gets the boost for this clause.  Documents matching
  52. /// this clause will (in addition to the normal weightings) have their score
  53. /// multiplied by <code>b</code>.   The boost is 1.0 by default.
  54. /// </summary>
  55. public virtual float GetBoost()
  56. {
  57. return boost;
  58. }
  59. /// <summary>Prints a query to a string, with <code>field</code> as the default field
  60. /// for terms.  <p>The representation used is one that is supposed to be readable
  61. /// by {@link Lucene.Net.queryParser.QueryParser QueryParser}. However,
  62. /// there are the following limitations:
  63. /// <ul>
  64. /// <li>If the query was created by the parser, the printed
  65. /// representation may not be exactly what was parsed. For example,
  66. /// characters that need to be escaped will be represented without
  67. /// the required backslash.</li>
  68. /// <li>Some of the more complicated queries (e.g. span queries)
  69. /// don't have a representation that can be parsed by QueryParser.</li>
  70. /// </ul>
  71. /// </summary>
  72. public abstract System.String ToString(System.String field);
  73. /// <summary>Prints a query to a string. </summary>
  74. public override System.String ToString()
  75. {
  76. return ToString("");
  77. }
  78. /// <summary>Expert: Constructs an appropriate Weight implementation for this query.
  79. /// 
  80. /// <p>Only implemented by primitive queries, which re-write to themselves.
  81. /// </summary>
  82. protected internal virtual Weight CreateWeight(Searcher searcher)
  83. {
  84. throw new System.NotSupportedException();
  85. }
  86. /// <summary>Expert: Constructs and initializes a Weight for a top-level query. </summary>
  87. public virtual Weight Weight(Searcher searcher)
  88. {
  89. Query query = searcher.Rewrite(this);
  90. Weight weight = query.CreateWeight(searcher);
  91. float sum = weight.SumOfSquaredWeights();
  92. float norm = GetSimilarity(searcher).QueryNorm(sum);
  93. weight.Normalize(norm);
  94. return weight;
  95. }
  96. /// <summary>Expert: called to re-write queries into primitive queries. For example,
  97. /// a PrefixQuery will be rewritten into a BooleanQuery that consists
  98. /// of TermQuerys.
  99. /// </summary>
  100. public virtual Query Rewrite(IndexReader reader)
  101. {
  102. return this;
  103. }
  104. /// <summary>Expert: called when re-writing queries under MultiSearcher.
  105. /// 
  106. /// Create a single query suitable for use by all subsearchers (in 1-1
  107. /// correspondence with queries). This is an optimization of the OR of
  108. /// all queries. We handle the common optimization cases of equal
  109. /// queries and overlapping clauses of boolean OR queries (as generated
  110. /// by MultiTermQuery.rewrite() and RangeQuery.rewrite()).
  111. /// Be careful overriding this method as queries[0] determines which
  112. /// method will be called and is not necessarily of the same type as
  113. /// the other queries.
  114. /// </summary>
  115. public virtual Query Combine(Query[] queries)
  116. {
  117. System.Collections.Hashtable uniques = new System.Collections.Hashtable();
  118. for (int i = 0; i < queries.Length; i++)
  119. {
  120. Query query = queries[i];
  121. BooleanClause[] clauses = null;
  122. // check if we can split the query into clauses
  123. bool splittable = (query is BooleanQuery);
  124. if (splittable)
  125. {
  126. BooleanQuery bq = (BooleanQuery) query;
  127. splittable = bq.IsCoordDisabled();
  128. clauses = bq.GetClauses();
  129. for (int j = 0; splittable && j < clauses.Length; j++)
  130. {
  131. splittable = (clauses[j].GetOccur() == BooleanClause.Occur.SHOULD);
  132. }
  133. }
  134. if (splittable)
  135. {
  136. for (int j = 0; j < clauses.Length; j++)
  137. {
  138.                         Query tmp = clauses[j].GetQuery();
  139. uniques.Add(tmp, tmp);
  140. }
  141. }
  142. else
  143. {
  144. uniques.Add(query, query);
  145. }
  146. }
  147. // optimization: if we have just one query, just return it
  148. if (uniques.Count == 1)
  149. {
  150. return (Query) uniques.GetEnumerator().Current;
  151. }
  152. System.Collections.IEnumerator it = uniques.GetEnumerator();
  153. BooleanQuery result = new BooleanQuery(true);
  154. while (it.MoveNext())
  155. {
  156. result.Add((Query) it.Current, BooleanClause.Occur.SHOULD);
  157. }
  158. return result;
  159. }
  160. /// <summary> Expert: adds all terms occuring in this query to the terms set. Only
  161. /// works if this query is in its {@link #rewrite rewritten} form.
  162. /// 
  163. /// </summary>
  164. /// <throws>  UnsupportedOperationException if this query is not yet rewritten </throws>
  165. public virtual void  ExtractTerms(System.Collections.Hashtable terms)
  166. {
  167. // needs to be implemented by query subclasses
  168. throw new System.NotSupportedException();
  169. }
  170. /// <summary>Expert: merges the clauses of a set of BooleanQuery's into a single
  171. /// BooleanQuery.
  172. /// 
  173. /// <p>A utility for use by {@link #Combine(Query[])} implementations.
  174. /// </summary>
  175. public static Query MergeBooleanQueries(Query[] queries)
  176. {
  177. System.Collections.Hashtable allClauses = new System.Collections.Hashtable();
  178. for (int i = 0; i < queries.Length; i++)
  179. {
  180. BooleanClause[] clauses = ((BooleanQuery) queries[i]).GetClauses();
  181. for (int j = 0; j < clauses.Length; j++)
  182. {
  183. allClauses.Add(clauses[j], clauses[j]);
  184. }
  185. }
  186. bool coordDisabled = queries.Length == 0 ? false : ((BooleanQuery) queries[0]).IsCoordDisabled();
  187. BooleanQuery result = new BooleanQuery(coordDisabled);
  188.             foreach (BooleanClause booleanClause in allClauses.Keys)             {                 result.Add(booleanClause);             }
  189. return result;
  190. }
  191. /// <summary>Expert: Returns the Similarity implementation to be used for this query.
  192. /// Subclasses may override this method to specify their own Similarity
  193. /// implementation, perhaps one that delegates through that of the Searcher.
  194. /// By default the Searcher's Similarity implementation is returned.
  195. /// </summary>
  196. public virtual Similarity GetSimilarity(Searcher searcher)
  197. {
  198. return searcher.GetSimilarity();
  199. }
  200. /// <summary>Returns a clone of this query. </summary>
  201. public virtual System.Object Clone()
  202. {
  203. try
  204. {
  205. return (Query) base.MemberwiseClone();
  206. }
  207. catch (System.Exception e)
  208. {
  209. throw new System.SystemException("Clone not supported: " + e.Message);
  210. }
  211. }
  212. }
  213. }