Searcher.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 Document = Lucene.Net.Documents.Document;
  18. using Term = Lucene.Net.Index.Term;
  19. namespace Lucene.Net.Search
  20. {
  21. /// <summary>An abstract base class for search implementations.
  22. /// Implements the main search methods.
  23. /// 
  24. /// <p>Note that you can only access Hits from a Searcher as long as it is
  25. /// not yet closed, otherwise an IOException will be thrown. 
  26. /// </summary>
  27. public abstract class Searcher : Lucene.Net.Search.Searchable
  28. {
  29. public Searcher()
  30. {
  31. InitBlock();
  32. }
  33. private void  InitBlock()
  34. {
  35. similarity = Similarity.GetDefault();
  36. }
  37. /// <summary>Returns the documents matching <code>query</code>. </summary>
  38. /// <throws>  BooleanQuery.TooManyClauses </throws>
  39. public Hits Search(Query query)
  40. {
  41. return Search(query, (Filter) null);
  42. }
  43. /// <summary>Returns the documents matching <code>query</code> and
  44. /// <code>filter</code>.
  45. /// </summary>
  46. /// <throws>  BooleanQuery.TooManyClauses </throws>
  47. public virtual Hits Search(Query query, Filter filter)
  48. {
  49. return new Hits(this, query, filter);
  50. }
  51. /// <summary>Returns documents matching <code>query</code> sorted by
  52. /// <code>sort</code>.
  53. /// </summary>
  54. /// <throws>  BooleanQuery.TooManyClauses </throws>
  55. public virtual Hits Search(Query query, Sort sort)
  56. {
  57. return new Hits(this, query, null, sort);
  58. }
  59. /// <summary>Returns documents matching <code>query</code> and <code>filter</code>,
  60. /// sorted by <code>sort</code>.
  61. /// </summary>
  62. /// <throws>  BooleanQuery.TooManyClauses </throws>
  63. public virtual Hits Search(Query query, Filter filter, Sort sort)
  64. {
  65. return new Hits(this, query, filter, sort);
  66. }
  67. /// <summary>Expert: Low-level search implementation with arbitrary sorting.  Finds
  68. /// the top <code>n</code> hits for <code>query</code>, applying
  69. /// <code>filter</code> if non-null, and sorting the hits by the criteria in
  70. /// <code>sort</code>.
  71. /// 
  72. /// <p>Applications should usually call {@link
  73. /// Searcher#Search(Query,Filter,Sort)} instead.
  74. /// </summary>
  75. /// <throws>  BooleanQuery.TooManyClauses </throws>
  76. public virtual TopFieldDocs Search(Query query, Filter filter, int n, Sort sort)
  77. {
  78. return Search(CreateWeight(query), filter, n, sort);
  79. }
  80. /// <summary>Lower-level search API.
  81. /// 
  82. /// <p>{@link HitCollector#Collect(int,float)} is called for every non-zero
  83. /// scoring document.
  84. /// 
  85. /// <p>Applications should only use this if they need <i>all</i> of the
  86. /// matching documents.  The high-level search API ({@link
  87. /// Searcher#Search(Query)}) is usually more efficient, as it skips
  88. /// non-high-scoring hits.
  89. /// <p>Note: The <code>score</code> passed to this method is a raw score.
  90. /// In other words, the score will not necessarily be a float whose value is
  91. /// between 0 and 1.
  92. /// </summary>
  93. /// <throws>  BooleanQuery.TooManyClauses </throws>
  94. public virtual void  Search(Query query, HitCollector results)
  95. {
  96. Search(query, (Filter) null, results);
  97. }
  98. /// <summary>Lower-level search API.
  99. /// 
  100. /// <p>{@link HitCollector#Collect(int,float)} is called for every non-zero
  101. /// scoring document.
  102. /// <br>HitCollector-based access to remote indexes is discouraged.
  103. /// 
  104. /// <p>Applications should only use this if they need <i>all</i> of the
  105. /// matching documents.  The high-level search API ({@link
  106. /// Searcher#Search(Query)}) is usually more efficient, as it skips
  107. /// non-high-scoring hits.
  108. /// 
  109. /// </summary>
  110. /// <param name="query">to match documents
  111. /// </param>
  112. /// <param name="filter">if non-null, a bitset used to eliminate some documents
  113. /// </param>
  114. /// <param name="results">to receive hits
  115. /// </param>
  116. /// <throws>  BooleanQuery.TooManyClauses </throws>
  117. public virtual void  Search(Query query, Filter filter, HitCollector results)
  118. {
  119. Search(CreateWeight(query), filter, results);
  120. }
  121. /// <summary>Expert: Low-level search implementation.  Finds the top <code>n</code>
  122. /// hits for <code>query</code>, applying <code>filter</code> if non-null.
  123. /// 
  124. /// <p>Called by {@link Hits}.
  125. /// 
  126. /// <p>Applications should usually call {@link Searcher#Search(Query)} or
  127. /// {@link Searcher#Search(Query,Filter)} instead.
  128. /// </summary>
  129. /// <throws>  BooleanQuery.TooManyClauses </throws>
  130. public virtual TopDocs Search(Query query, Filter filter, int n)
  131. {
  132. return Search(CreateWeight(query), filter, n);
  133. }
  134. /// <summary>Returns an Explanation that describes how <code>doc</code> scored against
  135. /// <code>query</code>.
  136. /// 
  137. /// <p>This is intended to be used in developing Similarity implementations,
  138. /// and, for good performance, should not be displayed with every hit.
  139. /// Computing an explanation is as expensive as executing the query over the
  140. /// entire index.
  141. /// </summary>
  142. public virtual Explanation Explain(Query query, int doc)
  143. {
  144. return Explain(CreateWeight(query), doc);
  145. }
  146. /// <summary>The Similarity implementation used by this searcher. </summary>
  147. private Similarity similarity;
  148. /// <summary>Expert: Set the Similarity implementation used by this Searcher.
  149. /// 
  150. /// </summary>
  151. /// <seealso cref="Similarity.SetDefault(Similarity)">
  152. /// </seealso>
  153. public virtual void  SetSimilarity(Similarity similarity)
  154. {
  155. this.similarity = similarity;
  156. }
  157. /// <summary>Expert: Return the Similarity implementation used by this Searcher.
  158. /// 
  159. /// <p>This defaults to the current value of {@link Similarity#GetDefault()}.
  160. /// </summary>
  161. public virtual Similarity GetSimilarity()
  162. {
  163. return this.similarity;
  164. }
  165. /// <summary> creates a weight for <code>query</code></summary>
  166. /// <returns> new weight
  167. /// </returns>
  168. protected internal virtual Weight CreateWeight(Query query)
  169. {
  170. return query.Weight(this);
  171. }
  172. // inherit javadoc
  173. public virtual int[] DocFreqs(Term[] terms)
  174. {
  175. int[] result = new int[terms.Length];
  176. for (int i = 0; i < terms.Length; i++)
  177. {
  178. result[i] = DocFreq(terms[i]);
  179. }
  180. return result;
  181. }
  182. /* The following abstract methods were added as a workaround for GCJ bug #15411.
  183. * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15411
  184. */
  185. abstract public void  Search(Weight weight, Filter filter, HitCollector results);
  186. abstract public void  Close();
  187. abstract public int DocFreq(Term term);
  188. abstract public int MaxDoc();
  189. abstract public TopDocs Search(Weight weight, Filter filter, int n);
  190. abstract public Document Doc(int i);
  191. abstract public Query Rewrite(Query query);
  192. abstract public Explanation Explain(Weight weight, int doc);
  193. abstract public TopFieldDocs Search(Weight weight, Filter filter, int n, Sort sort);
  194. /* End patch for GCJ bug #15411. */
  195. }
  196. }