PrefixQuery.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 TermEnum = Lucene.Net.Index.TermEnum;
  20. using ToStringUtils = Lucene.Net.Util.ToStringUtils;
  21. namespace Lucene.Net.Search
  22. {
  23. /// <summary>A Query that matches documents containing terms with a specified prefix. A PrefixQuery
  24. /// is built by QueryParser for input like <code>app*</code>. 
  25. /// </summary>
  26. [Serializable]
  27. public class PrefixQuery : Query
  28. {
  29. private Term prefix;
  30. /// <summary>Constructs a query for terms starting with <code>prefix</code>. </summary>
  31. public PrefixQuery(Term prefix)
  32. {
  33. this.prefix = prefix;
  34. }
  35. /// <summary>Returns the prefix of this query. </summary>
  36. public virtual Term GetPrefix()
  37. {
  38. return prefix;
  39. }
  40. public override Query Rewrite(IndexReader reader)
  41. {
  42. BooleanQuery query = new BooleanQuery(true);
  43. TermEnum enumerator = reader.Terms(prefix);
  44. try
  45. {
  46. System.String prefixText = prefix.Text();
  47. System.String prefixField = prefix.Field();
  48. do 
  49. {
  50. Term term = enumerator.Term();
  51. if (term != null && term.Text().StartsWith(prefixText) && term.Field() == prefixField)
  52. {
  53. TermQuery tq = new TermQuery(term); // found a match
  54. tq.SetBoost(GetBoost()); // set the boost
  55. query.Add(tq, BooleanClause.Occur.SHOULD); // add to query
  56. //System.out.println("added " + term);
  57. }
  58. else
  59. {
  60. break;
  61. }
  62. }
  63. while (enumerator.Next());
  64. }
  65. finally
  66. {
  67. enumerator.Close();
  68. }
  69. return query;
  70. }
  71. /// <summary>Prints a user-readable version of this query. </summary>
  72. public override System.String ToString(System.String field)
  73. {
  74. System.Text.StringBuilder buffer = new System.Text.StringBuilder();
  75. if (!prefix.Field().Equals(field))
  76. {
  77. buffer.Append(prefix.Field());
  78. buffer.Append(":");
  79. }
  80. buffer.Append(prefix.Text());
  81. buffer.Append('*');
  82. buffer.Append(ToStringUtils.Boost(GetBoost()));
  83. return buffer.ToString();
  84. }
  85. /// <summary>Returns true iff <code>o</code> is equal to this. </summary>
  86. public  override bool Equals(System.Object o)
  87. {
  88. if (!(o is PrefixQuery))
  89. return false;
  90. PrefixQuery other = (PrefixQuery) o;
  91. return (this.GetBoost() == other.GetBoost()) && this.prefix.Equals(other.prefix);
  92. }
  93. /// <summary>Returns a hash code value for this object.</summary>
  94. public override int GetHashCode()
  95. {
  96. return BitConverter.ToInt32(BitConverter.GetBytes(GetBoost()), 0) ^ prefix.GetHashCode();
  97. }
  98.         // {{Aroush-1.9}} Do we need this?!
  99.         override public System.Object Clone()
  100. {
  101. return null;
  102. }
  103. }
  104. }