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

搜索引擎

开发平台:

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>Scorer for conjunctions, sets of queries, all of which are required. </summary>
  20. class ConjunctionScorer : Scorer
  21. {
  22. private class AnonymousClassComparator : System.Collections.IComparer
  23. {
  24. public AnonymousClassComparator(ConjunctionScorer enclosingInstance)
  25. {
  26. InitBlock(enclosingInstance);
  27. }
  28. private void  InitBlock(ConjunctionScorer enclosingInstance)
  29. {
  30. this.enclosingInstance = enclosingInstance;
  31. }
  32. private ConjunctionScorer enclosingInstance;
  33. public ConjunctionScorer Enclosing_Instance
  34. {
  35. get
  36. {
  37. return enclosingInstance;
  38. }
  39. }
  40. // sort the array
  41. public virtual int Compare(System.Object o1, System.Object o2)
  42. {
  43. return ((Scorer) o1).Doc() - ((Scorer) o2).Doc();
  44. }
  45. }
  46. private System.Collections.ArrayList scorers = new System.Collections.ArrayList();
  47. private bool firstTime = true;
  48. private bool more = true;
  49. private float coord;
  50. public ConjunctionScorer(Similarity similarity):base(similarity)
  51. {
  52. }
  53. internal void  Add(Scorer scorer)
  54. {
  55. scorers.Insert(scorers.Count, scorer);
  56. }
  57. private Scorer First()
  58. {
  59. return (Scorer) scorers[0];
  60. }
  61. private Scorer Last()
  62. {
  63. return (Scorer) scorers[scorers.Count - 1];
  64. }
  65. public override int Doc()
  66. {
  67. return First().Doc();
  68. }
  69. public override bool Next()
  70. {
  71. if (firstTime)
  72. {
  73. Init(true);
  74. }
  75. else if (more)
  76. {
  77. more = Last().Next(); // trigger further scanning
  78. }
  79. return DoNext();
  80. }
  81. private bool DoNext()
  82. {
  83. while (more && First().Doc() < Last().Doc())
  84. {
  85. // find doc w/ all clauses
  86. more = First().SkipTo(Last().Doc()); // skip first upto last
  87. System.Object tempObject;
  88. tempObject = scorers[0];
  89. scorers.RemoveAt(0);
  90. scorers.Insert(scorers.Count, tempObject); // move first to last
  91. }
  92. return more; // found a doc with all clauses
  93. }
  94. public override bool SkipTo(int target)
  95. {
  96. if (firstTime)
  97. {
  98. Init(false);
  99. }
  100. System.Collections.IEnumerator i = scorers.GetEnumerator();
  101. while (more && i.MoveNext())
  102. {
  103. more = ((Scorer) i.Current).SkipTo(target);
  104. }
  105. if (more)
  106. SortScorers(); // re-sort scorers
  107. return DoNext();
  108. }
  109. public override float Score()
  110. {
  111. float score = 0.0f; // sum scores
  112. System.Collections.IEnumerator i = scorers.GetEnumerator();
  113. while (i.MoveNext())
  114. {
  115. score += ((Scorer) i.Current).Score();
  116. }
  117. score *= coord;
  118. return score;
  119. }
  120. private void  Init(bool initScorers)
  121. {
  122. //  compute coord factor
  123. coord = GetSimilarity().Coord(scorers.Count, scorers.Count);
  124. more = scorers.Count > 0;
  125. if (initScorers)
  126. {
  127. // move each scorer to its first entry
  128. System.Collections.IEnumerator i = scorers.GetEnumerator();
  129. while (more && i.MoveNext())
  130. {
  131. more = ((Scorer) i.Current).Next();
  132. }
  133. if (more)
  134. SortScorers(); // initial sort of list
  135. }
  136. firstTime = false;
  137. }
  138. private void  SortScorers()
  139. {
  140. // move scorers to an array
  141. Scorer[] array = (Scorer[]) scorers.ToArray(typeof(Scorer));
  142. scorers.Clear(); // empty the list
  143. // note that this comparator is not consistent with equals!
  144. System.Array.Sort(array, new AnonymousClassComparator(this));
  145. for (int i = 0; i < array.Length; i++)
  146. {
  147. scorers.Insert(scorers.Count, array[i]); // re-build list, now sorted
  148. }
  149. }
  150. public override Explanation Explain(int doc)
  151. {
  152. throw new System.NotSupportedException();
  153. }
  154. }
  155. }