BooleanClause.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 Parameter = Lucene.Net.Util.Parameter;
  18. namespace Lucene.Net.Search
  19. {
  20. /// <summary>A clause in a BooleanQuery. </summary>
  21. [Serializable]
  22. public class BooleanClause
  23. {
  24. [Serializable]
  25. public sealed class Occur:Parameter
  26. {
  27. internal Occur(System.String name):base(name)
  28. {
  29. }
  30. public override System.String ToString()
  31. {
  32. if (this == MUST)
  33. return "+";
  34. if (this == MUST_NOT)
  35. return "-";
  36. return "";
  37. }
  38. /// <summary>Use this operator for terms that <i>must</i> appear in the matching documents. </summary>
  39. public static readonly Occur MUST = new Occur("MUST");
  40. /// <summary>Use this operator for terms that <i>should</i> appear in the 
  41. /// matching documents. For a BooleanQuery with two <code>SHOULD</code> 
  42. /// subqueries, at least one of the queries must appear in the matching documents. 
  43. /// </summary>
  44. public static readonly Occur SHOULD = new Occur("SHOULD");
  45. /// <summary>Use this operator for terms that <i>must not</i> appear in the matching documents.
  46. /// Note that it is not possible to search for queries that only consist
  47. /// of a <code>MUST_NOT</code> query. 
  48. /// </summary>
  49. public static readonly Occur MUST_NOT = new Occur("MUST_NOT");
  50. }
  51. /// <summary>The query whose matching documents are combined by the boolean query.</summary>
  52. /// <deprecated> use {@link #SetQuery(Query)} instead 
  53. /// </deprecated>
  54. public Query query; // TODO: decrease visibility for Lucene 2.0
  55. /// <summary>If true, documents documents which <i>do not</i>
  56. /// match this sub-query will <i>not</i> match the boolean query.
  57. /// </summary>
  58. /// <deprecated> use {@link #SetOccur(BooleanClause.Occur)} instead 
  59. /// </deprecated>
  60. public bool required = false; // TODO: decrease visibility for Lucene 2.0
  61. /// <summary>If true, documents documents which <i>do</i>
  62. /// match this sub-query will <i>not</i> match the boolean query.
  63. /// </summary>
  64. /// <deprecated> use {@link #SetOccur(BooleanClause.Occur)} instead 
  65. /// </deprecated>
  66. public bool prohibited = false; // TODO: decrease visibility for Lucene 2.0
  67. private Occur occur = Occur.SHOULD;
  68. /// <summary>Constructs a BooleanClause with query <code>q</code>, required
  69. /// <code>r</code> and prohibited <code>p</code>.
  70. /// </summary>
  71. /// <deprecated> use BooleanClause(Query, Occur) instead
  72. /// <ul>
  73. /// <li>For BooleanClause(query, true, false) use BooleanClause(query, BooleanClause.Occur.MUST)
  74. /// <li>For BooleanClause(query, false, false) use BooleanClause(query, BooleanClause.Occur.SHOULD)
  75. /// <li>For BooleanClause(query, false, true) use BooleanClause(query, BooleanClause.Occur.MUST_NOT)
  76. /// </ul>
  77. /// </deprecated>
  78. public BooleanClause(Query q, bool r, bool p)
  79. {
  80. // TODO: remove for Lucene 2.0
  81. query = q;
  82. required = r;
  83. prohibited = p;
  84. if (required)
  85. {
  86. if (prohibited)
  87. {
  88. // prohibited && required doesn't make sense, but we want the old behaviour:
  89. occur = Occur.MUST_NOT;
  90. }
  91. else
  92. {
  93. occur = Occur.MUST;
  94. }
  95. }
  96. else
  97. {
  98. if (prohibited)
  99. {
  100. occur = Occur.MUST_NOT;
  101. }
  102. else
  103. {
  104. occur = Occur.SHOULD;
  105. }
  106. }
  107. }
  108. /// <summary>Constructs a BooleanClause.</summary>
  109. public BooleanClause(Query query, Occur occur)
  110. {
  111. this.query = query;
  112. this.occur = occur;
  113. SetFields(occur);
  114. }
  115. public virtual Occur GetOccur()
  116. {
  117. return occur;
  118. }
  119. public virtual void  SetOccur(Occur occur)
  120. {
  121. this.occur = occur;
  122. SetFields(occur);
  123. }
  124. public virtual Query GetQuery()
  125. {
  126. return query;
  127. }
  128. public virtual void  SetQuery(Query query)
  129. {
  130. this.query = query;
  131. }
  132. public virtual bool IsProhibited()
  133. {
  134. return prohibited;
  135. }
  136. public virtual bool IsRequired()
  137. {
  138. return required;
  139. }
  140. private void  SetFields(Occur occur)
  141. {
  142. if (occur == Occur.MUST)
  143. {
  144. required = true;
  145. prohibited = false;
  146. }
  147. else if (occur == Occur.SHOULD)
  148. {
  149. required = false;
  150. prohibited = false;
  151. }
  152. else if (occur == Occur.MUST_NOT)
  153. {
  154. required = false;
  155. prohibited = true;
  156. }
  157. else
  158. {
  159. throw new System.ArgumentException("Unknown operator " + occur);
  160. }
  161. }
  162. /// <summary>Returns true iff <code>o</code> is equal to this. </summary>
  163. public  override bool Equals(System.Object o)
  164. {
  165. if (!(o is BooleanClause))
  166. return false;
  167. BooleanClause other = (BooleanClause) o;
  168. return this.query.Equals(other.query) && (this.required == other.required) && (this.prohibited == other.prohibited);
  169. }
  170. /// <summary>Returns a hash code value for this object.</summary>
  171. public override int GetHashCode()
  172. {
  173. return query.GetHashCode() ^ (this.required?1:0) ^ (this.prohibited?2:0);
  174. }
  175. public override System.String ToString()
  176. {
  177. return occur.ToString() + query.ToString();
  178. }
  179. }
  180. }