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

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2005 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>A Scorer for queries with a required part and an optional part.
  20. /// Delays skipTo() on the optional part until a score() is needed.
  21. /// <br>
  22. /// This <code>Scorer</code> implements {@link Scorer#SkipTo(int)}.
  23. /// </summary>
  24. public class ReqOptSumScorer : Scorer
  25. {
  26. /// <summary>The scorers passed from the constructor.
  27. /// These are set to null as soon as their next() or skipTo() returns false.
  28. /// </summary>
  29. private Scorer reqScorer;
  30. private Scorer optScorer;
  31. /// <summary>Construct a <code>ReqOptScorer</code>.</summary>
  32. /// <param name="reqScorer">The required scorer. This must match.
  33. /// </param>
  34. /// <param name="optScorer">The optional scorer. This is used for scoring only.
  35. /// </param>
  36. public ReqOptSumScorer(Scorer reqScorer, Scorer optScorer) : base(null)
  37. { // No similarity used.
  38. this.reqScorer = reqScorer;
  39. this.optScorer = optScorer;
  40. }
  41. private bool firstTimeOptScorer = true;
  42. public override bool Next()
  43. {
  44. return reqScorer.Next();
  45. }
  46. public override bool SkipTo(int target)
  47. {
  48. return reqScorer.SkipTo(target);
  49. }
  50. public override int Doc()
  51. {
  52. return reqScorer.Doc();
  53. }
  54. /// <summary>Returns the score of the current document matching the query.
  55. /// Initially invalid, until {@link #Next()} is called the first time.
  56. /// </summary>
  57. /// <returns> The score of the required scorer, eventually increased by the score
  58. /// of the optional scorer when it also matches the current document.
  59. /// </returns>
  60. public override float Score()
  61. {
  62. int curDoc = reqScorer.Doc();
  63. float reqScore = reqScorer.Score();
  64. if (firstTimeOptScorer)
  65. {
  66. firstTimeOptScorer = false;
  67. if (!optScorer.SkipTo(curDoc))
  68. {
  69. optScorer = null;
  70. return reqScore;
  71. }
  72. }
  73. else if (optScorer == null)
  74. {
  75. return reqScore;
  76. }
  77. else if ((optScorer.Doc() < curDoc) && (!optScorer.SkipTo(curDoc)))
  78. {
  79. optScorer = null;
  80. return reqScore;
  81. }
  82. // assert (optScorer != null) && (optScorer.doc() >= curDoc);
  83. return (optScorer.Doc() == curDoc)?reqScore + optScorer.Score():reqScore;
  84. }
  85. /// <summary>Explain the score of a document.</summary>
  86. /// <todo>  Also show the total score. </todo>
  87. /// <summary> See BooleanScorer.explain() on how to do this.
  88. /// </summary>
  89. public override Explanation Explain(int doc)
  90. {
  91. Explanation res = new Explanation();
  92. res.SetDescription("required, optional");
  93. res.AddDetail(reqScorer.Explain(doc));
  94. res.AddDetail(optScorer.Explain(doc));
  95. return res;
  96. }
  97. }
  98. }