SpanScorer.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 Explanation = Lucene.Net.Search.Explanation;
  18. using Scorer = Lucene.Net.Search.Scorer;
  19. using Similarity = Lucene.Net.Search.Similarity;
  20. using Weight = Lucene.Net.Search.Weight;
  21. namespace Lucene.Net.Search.Spans
  22. {
  23. class SpanScorer : Scorer
  24. {
  25. private Spans spans;
  26. private Weight weight;
  27. private byte[] norms;
  28. private float value_Renamed;
  29. private bool firstTime = true;
  30. private bool more = true;
  31. private int doc;
  32. private float freq;
  33. internal SpanScorer(Spans spans, Weight weight, Similarity similarity, byte[] norms) : base(similarity)
  34. {
  35. this.spans = spans;
  36. this.norms = norms;
  37. this.weight = weight;
  38. this.value_Renamed = weight.GetValue();
  39. }
  40. public override bool Next()
  41. {
  42. if (firstTime)
  43. {
  44. more = spans.Next();
  45. firstTime = false;
  46. }
  47. if (!more)
  48. return false;
  49. freq = 0.0f;
  50. doc = spans.Doc();
  51. while (more && doc == spans.Doc())
  52. {
  53. int matchLength = spans.End() - spans.Start();
  54. freq += GetSimilarity().SloppyFreq(matchLength);
  55. more = spans.Next();
  56. }
  57. return more || freq != 0.0f;
  58. }
  59. public override int Doc()
  60. {
  61. return doc;
  62. }
  63. public override float Score()
  64. {
  65. float raw = GetSimilarity().Tf(freq) * value_Renamed; // raw score
  66. return raw * Similarity.DecodeNorm(norms[doc]); // normalize
  67. }
  68. public override bool SkipTo(int target)
  69. {
  70. more = spans.SkipTo(target);
  71. if (!more)
  72. return false;
  73. freq = 0.0f;
  74. doc = spans.Doc();
  75. while (more && spans.Doc() == target)
  76. {
  77. freq += GetSimilarity().SloppyFreq(spans.End() - spans.Start());
  78. more = spans.Next();
  79. }
  80. return more || freq != 0.0f;
  81. }
  82. public override Explanation Explain(int doc)
  83. {
  84. Explanation tfExplanation = new Explanation();
  85. SkipTo(doc);
  86. float phraseFreq = (Doc() == doc)?freq:0.0f;
  87. tfExplanation.SetValue(GetSimilarity().Tf(phraseFreq));
  88. tfExplanation.SetDescription("tf(phraseFreq=" + phraseFreq + ")");
  89. return tfExplanation;
  90. }
  91. }
  92. }