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

搜索引擎

开发平台:

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. namespace Lucene.Net.Search
  18. {
  19. /// <summary> Encapsulates sort criteria for returned hits.
  20. /// 
  21. /// <p>The fields used to determine sort order must be carefully chosen.
  22. /// Documents must contain a single term in such a field,
  23. /// and the value of the term should indicate the document's relative position in
  24. /// a given sort order.  The field must be indexed, but should not be tokenized,
  25. /// and does not need to be stored (unless you happen to want it back with the
  26. /// rest of your document data).  In other words:
  27. /// 
  28. /// <p><code>document.add (new Field ("byNumber", Integer.toString(x), Field.Store.NO, Field.Index.UN_TOKENIZED));</code></p>
  29. /// 
  30. /// 
  31. /// <p><h3>Valid Types of Values</h3>
  32. /// 
  33. /// <p>There are three possible kinds of term values which may be put into
  34. /// sorting fields: Integers, Floats, or Strings.  Unless
  35. /// {@link SortField SortField} objects are specified, the type of value
  36. /// in the field is determined by parsing the first term in the field.
  37. /// 
  38. /// <p>Integer term values should contain only digits and an optional
  39. /// preceeding negative sign.  Values must be base 10 and in the range
  40. /// <code>Integer.MIN_VALUE</code> and <code>Integer.MAX_VALUE</code> inclusive.
  41. /// Documents which should appear first in the sort
  42. /// should have low value integers, later documents high values
  43. /// (i.e. the documents should be numbered <code>1..n</code> where
  44. /// <code>1</code> is the first and <code>n</code> the last).
  45. /// 
  46. /// <p>Float term values should conform to values accepted by
  47. /// {@link Float Float.valueOf(String)} (except that <code>NaN</code>
  48. /// and <code>Infinity</code> are not supported).
  49. /// Documents which should appear first in the sort
  50. /// should have low values, later documents high values.
  51. /// 
  52. /// <p>String term values can contain any valid String, but should
  53. /// not be tokenized.  The values are sorted according to their
  54. /// {@link Comparable natural order}.  Note that using this type
  55. /// of term value has higher memory requirements than the other
  56. /// two types.
  57. /// 
  58. /// <p><h3>Object Reuse</h3>
  59. /// 
  60. /// <p>One of these objects can be
  61. /// used multiple times and the sort order changed between usages.
  62. /// 
  63. /// <p>This class is thread safe.
  64. /// 
  65. /// <p><h3>Memory Usage</h3>
  66. /// 
  67. /// <p>Sorting uses of caches of term values maintained by the
  68. /// internal HitQueue(s).  The cache is static and contains an integer
  69. /// or float array of length <code>IndexReader.maxDoc()</code> for each field
  70. /// name for which a sort is performed.  In other words, the size of the
  71. /// cache in bytes is:
  72. /// 
  73. /// <p><code>4 * IndexReader.maxDoc() * (# of different fields actually used to sort)</code>
  74. /// 
  75. /// <p>For String fields, the cache is larger: in addition to the
  76. /// above array, the value of every term in the field is kept in memory.
  77. /// If there are many unique terms in the field, this could
  78. /// be quite large.
  79. /// 
  80. /// <p>Note that the size of the cache is not affected by how many
  81. /// fields are in the index and <i>might</i> be used to sort - only by
  82. /// the ones actually used to sort a result set.
  83. /// 
  84. /// <p>The cache is cleared each time a new <code>IndexReader</code> is
  85. /// passed in, or if the value returned by <code>maxDoc()</code>
  86. /// changes for the current IndexReader.  This class is not set up to
  87. /// be able to efficiently sort hits from more than one index
  88. /// simultaneously.
  89. /// 
  90. /// <p>Created: Feb 12, 2004 10:53:57 AM
  91. /// 
  92. /// </summary>
  93. /// <author>   Tim Jones (Nacimiento Software)
  94. /// </author>
  95. /// <since>   lucene 1.4
  96. /// </since>
  97. /// <version>  $Id: Sort.java 150618 2004-10-18 22:36:54Z dnaber $
  98. /// </version>
  99. [Serializable]
  100. public class Sort
  101. {
  102. /// <summary> Represents sorting by computed relevance. Using this sort criteria returns
  103. /// the same results as calling
  104. /// {@link Searcher#Search(Query) Searcher#search()}without a sort criteria,
  105. /// only with slightly more overhead.
  106. /// </summary>
  107. public static readonly Sort RELEVANCE = new Sort();
  108. /// <summary>Represents sorting by index order. </summary>
  109. public static readonly Sort INDEXORDER;
  110. // internal representation of the sort criteria
  111. internal SortField[] fields;
  112. /// <summary> Sorts by computed relevance. This is the same sort criteria as calling
  113. /// {@link Searcher#Search(Query) Searcher#search()}without a sort criteria,
  114. /// only with slightly more overhead.
  115. /// </summary>
  116. public Sort():this(new SortField[]{SortField.FIELD_SCORE, SortField.FIELD_DOC})
  117. {
  118. }
  119. /// <summary> Sorts by the terms in <code>field</code> then by index order (document
  120. /// number). The type of value in <code>field</code> is determined
  121. /// automatically.
  122. /// 
  123. /// </summary>
  124. /// <seealso cref="SortField.AUTO">
  125. /// </seealso>
  126. public Sort(System.String field)
  127. {
  128. SetSort(field, false);
  129. }
  130. /// <summary> Sorts possibly in reverse by the terms in <code>field</code> then by
  131. /// index order (document number). The type of value in <code>field</code> is
  132. /// determined automatically.
  133. /// 
  134. /// </summary>
  135. /// <seealso cref="SortField.AUTO">
  136. /// </seealso>
  137. public Sort(System.String field, bool reverse)
  138. {
  139. SetSort(field, reverse);
  140. }
  141. /// <summary> Sorts in succession by the terms in each field. The type of value in
  142. /// <code>field</code> is determined automatically.
  143. /// 
  144. /// </summary>
  145. /// <seealso cref="SortField.AUTO">
  146. /// </seealso>
  147. public Sort(System.String[] fields)
  148. {
  149. SetSort(fields);
  150. }
  151. /// <summary>Sorts by the criteria in the given SortField. </summary>
  152. public Sort(SortField field)
  153. {
  154. SetSort(field);
  155. }
  156. /// <summary>Sorts in succession by the criteria in each SortField. </summary>
  157. public Sort(SortField[] fields)
  158. {
  159. SetSort(fields);
  160. }
  161. /// <summary> Sets the sort to the terms in <code>field</code> then by index order
  162. /// (document number).
  163. /// </summary>
  164. public void  SetSort(System.String field)
  165. {
  166. SetSort(field, false);
  167. }
  168. /// <summary> Sets the sort to the terms in <code>field</code> possibly in reverse,
  169. /// then by index order (document number).
  170. /// </summary>
  171. public virtual void  SetSort(System.String field, bool reverse)
  172. {
  173. SortField[] nfields = new SortField[]{new SortField(field, SortField.AUTO, reverse), SortField.FIELD_DOC};
  174. fields = nfields;
  175. }
  176. /// <summary>Sets the sort to the terms in each field in succession. </summary>
  177. public virtual void  SetSort(System.String[] fieldnames)
  178. {
  179. int n = fieldnames.Length;
  180. SortField[] nfields = new SortField[n];
  181. for (int i = 0; i < n; ++i)
  182. {
  183. nfields[i] = new SortField(fieldnames[i], SortField.AUTO);
  184. }
  185. fields = nfields;
  186. }
  187. /// <summary>Sets the sort to the given criteria. </summary>
  188. public virtual void  SetSort(SortField field)
  189. {
  190. this.fields = new SortField[]{field};
  191. }
  192. /// <summary>Sets the sort to the given criteria in succession. </summary>
  193. public virtual void  SetSort(SortField[] fields)
  194. {
  195. this.fields = fields;
  196. }
  197. /// <summary> Representation of the sort criteria.</summary>
  198. /// <returns> Array of SortField objects used in this sort criteria
  199. /// </returns>
  200. public virtual SortField[] GetSort()
  201. {
  202. return fields;
  203. }
  204. public override System.String ToString()
  205. {
  206. System.Text.StringBuilder buffer = new System.Text.StringBuilder();
  207. for (int i = 0; i < fields.Length; i++)
  208. {
  209. buffer.Append(fields[i].ToString());
  210. if ((i + 1) < fields.Length)
  211. buffer.Append(',');
  212. }
  213. return buffer.ToString();
  214. }
  215. static Sort()
  216. {
  217. INDEXORDER = new Sort(SortField.FIELD_DOC);
  218. }
  219. }
  220. }