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

搜索引擎

开发平台:

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 Term = Lucene.Net.Index.Term;
  19. using ToStringUtils = Lucene.Net.Util.ToStringUtils;
  20. namespace Lucene.Net.Search
  21. {
  22. /// <summary> A {@link Query} that matches documents containing a subset of terms provided
  23. /// by a {@link FilteredTermEnum} enumeration.
  24. /// <P>
  25. /// <code>MultiTermQuery</code> is not designed to be used by itself.
  26. /// <BR>
  27. /// The reason being that it is not intialized with a {@link FilteredTermEnum}
  28. /// enumeration. A {@link FilteredTermEnum} enumeration needs to be provided.
  29. /// <P>
  30. /// For example, {@link WildcardQuery} and {@link FuzzyQuery} extend
  31. /// <code>MultiTermQuery</code> to provide {@link WildcardTermEnum} and
  32. /// {@link FuzzyTermEnum}, respectively.
  33. /// </summary>
  34. [Serializable]
  35. public abstract class MultiTermQuery:Query
  36. {
  37. private Term term;
  38. /// <summary>Constructs a query for terms matching <code>term</code>. </summary>
  39. public MultiTermQuery(Term term)
  40. {
  41. this.term = term;
  42. }
  43. /// <summary>Returns the pattern term. </summary>
  44. public virtual Term GetTerm()
  45. {
  46. return term;
  47. }
  48. /// <summary>Construct the enumeration to be used, expanding the pattern term. </summary>
  49. protected internal abstract FilteredTermEnum GetEnum(IndexReader reader);
  50. public override Query Rewrite(IndexReader reader)
  51. {
  52. FilteredTermEnum enumerator = GetEnum(reader);
  53. BooleanQuery query = new BooleanQuery(true);
  54. try
  55. {
  56. do 
  57. {
  58. Term t = enumerator.Term();
  59. if (t != null)
  60. {
  61. TermQuery tq = new TermQuery(t); // found a match
  62. tq.SetBoost(GetBoost() * enumerator.Difference()); // set the boost
  63. query.Add(tq, BooleanClause.Occur.SHOULD); // add to query
  64. }
  65. }
  66. while (enumerator.Next());
  67. }
  68. finally
  69. {
  70. enumerator.Close();
  71. }
  72. return query;
  73. }
  74. /// <summary>Prints a user-readable version of this query. </summary>
  75. public override System.String ToString(System.String field)
  76. {
  77. System.Text.StringBuilder buffer = new System.Text.StringBuilder();
  78. if (!term.Field().Equals(field))
  79. {
  80. buffer.Append(term.Field());
  81. buffer.Append(":");
  82. }
  83. buffer.Append(term.Text());
  84. buffer.Append(ToStringUtils.Boost(GetBoost()));
  85. return buffer.ToString();
  86. }
  87. public  override bool Equals(System.Object o)
  88. {
  89. if (this == o)
  90. return true;
  91. if (!(o is MultiTermQuery))
  92. return false;
  93. MultiTermQuery multiTermQuery = (MultiTermQuery) o;
  94. if (!term.Equals(multiTermQuery.term))
  95. return false;
  96. return GetBoost() == multiTermQuery.GetBoost();
  97. }
  98. public override int GetHashCode()
  99. {
  100. return term.GetHashCode();
  101. }
  102. }
  103. }