PhraseScorer.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. using Lucene.Net.Index;
  18. namespace Lucene.Net.Search
  19. {
  20. abstract class PhraseScorer : Scorer
  21. {
  22. private Weight weight;
  23. protected internal byte[] norms;
  24. protected internal float value_Renamed;
  25. private bool firstTime = true;
  26. private bool more = true;
  27. protected internal PhraseQueue pq;
  28. protected internal PhrasePositions first, last;
  29. private float freq;
  30. internal PhraseScorer(Weight weight, TermPositions[] tps, int[] positions, Similarity similarity, byte[] norms) : base(similarity)
  31. {
  32. this.norms = norms;
  33. this.weight = weight;
  34. this.value_Renamed = weight.GetValue();
  35. // convert tps to a list
  36. for (int i = 0; i < tps.Length; i++)
  37. {
  38. PhrasePositions pp = new PhrasePositions(tps[i], positions[i]);
  39. if (last != null)
  40. {
  41. // add next to end of list
  42. last.next = pp;
  43. }
  44. else
  45. first = pp;
  46. last = pp;
  47. }
  48. pq = new PhraseQueue(tps.Length); // construct empty pq
  49. }
  50. public override int Doc()
  51. {
  52. return first.doc;
  53. }
  54. public override bool Next()
  55. {
  56. if (firstTime)
  57. {
  58. Init();
  59. firstTime = false;
  60. }
  61. else if (more)
  62. {
  63. more = last.Next(); // trigger further scanning
  64. }
  65. return DoNext();
  66. }
  67. // next without initial increment
  68. private bool DoNext()
  69. {
  70. while (more)
  71. {
  72. while (more && first.doc < last.doc)
  73. {
  74. // find doc w/ all the terms
  75. more = first.SkipTo(last.doc); // skip first upto last
  76. FirstToLast(); // and move it to the end
  77. }
  78. if (more)
  79. {
  80. // found a doc with all of the terms
  81. freq = PhraseFreq(); // check for phrase
  82. if (freq == 0.0f)
  83. // no match
  84. more = last.Next();
  85. // trigger further scanning
  86. else
  87. return true; // found a match
  88. }
  89. }
  90. return false; // no more matches
  91. }
  92. public override float Score()
  93. {
  94. //System.out.println("scoring " + first.doc);
  95. float raw = GetSimilarity().Tf(freq) * value_Renamed; // raw score
  96. return raw * Similarity.DecodeNorm(norms[first.doc]); // normalize
  97. }
  98. public override bool SkipTo(int target)
  99. {
  100. for (PhrasePositions pp = first; more && pp != null; pp = pp.next)
  101. {
  102. more = pp.SkipTo(target);
  103. }
  104. if (more)
  105. Sort(); // re-sort
  106. return DoNext();
  107. }
  108. protected internal abstract float PhraseFreq();
  109. private void  Init()
  110. {
  111. for (PhrasePositions pp = first; more && pp != null; pp = pp.next)
  112. more = pp.Next();
  113. if (more)
  114. Sort();
  115. }
  116. private void  Sort()
  117. {
  118. pq.Clear();
  119. for (PhrasePositions pp = first; pp != null; pp = pp.next)
  120. pq.Put(pp);
  121. PqToList();
  122. }
  123. protected internal void  PqToList()
  124. {
  125. last = first = null;
  126. while (pq.Top() != null)
  127. {
  128. PhrasePositions pp = (PhrasePositions) pq.Pop();
  129. if (last != null)
  130. {
  131. // add next to end of list
  132. last.next = pp;
  133. }
  134. else
  135. first = pp;
  136. last = pp;
  137. pp.next = null;
  138. }
  139. }
  140. protected internal void  FirstToLast()
  141. {
  142. last.next = first; // move first to end of list
  143. last = first;
  144. first = first.next;
  145. last.next = null;
  146. }
  147. public override Explanation Explain(int doc)
  148. {
  149. Explanation tfExplanation = new Explanation();
  150. while (Next() && Doc() < doc)
  151. {
  152. }
  153. float phraseFreq = (Doc() == doc)?freq:0.0f;
  154. tfExplanation.SetValue(GetSimilarity().Tf(phraseFreq));
  155. tfExplanation.SetDescription("tf(phraseFreq=" + phraseFreq + ")");
  156. return tfExplanation;
  157. }
  158. public override System.String ToString()
  159. {
  160. return "scorer(" + weight + ")";
  161. }
  162. }
  163. }