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

搜索引擎

开发平台:

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 Explanation = Lucene.Net.Search.Explanation;
  20. using Query = Lucene.Net.Search.Query;
  21. using Scorer = Lucene.Net.Search.Scorer;
  22. using Searcher = Lucene.Net.Search.Searcher;
  23. using Similarity = Lucene.Net.Search.Similarity;
  24. using Weight = Lucene.Net.Search.Weight;
  25. namespace Lucene.Net.Search.Spans
  26. {
  27. [Serializable]
  28. class SpanWeight : Weight
  29. {
  30. private Similarity similarity;
  31. private float value_Renamed;
  32. private float idf;
  33. private float queryNorm;
  34. private float queryWeight;
  35. private System.Collections.ICollection terms;
  36. private SpanQuery query;
  37. public SpanWeight(SpanQuery query, Searcher searcher)
  38. {
  39. this.similarity = query.GetSimilarity(searcher);
  40. this.query = query;
  41. this.terms = query.GetTerms();
  42. idf = this.query.GetSimilarity(searcher).Idf(terms, searcher);
  43. }
  44. public virtual Query GetQuery()
  45. {
  46. return query;
  47. }
  48. public virtual float GetValue()
  49. {
  50. return value_Renamed;
  51. }
  52. public virtual float SumOfSquaredWeights()
  53. {
  54. queryWeight = idf * query.GetBoost(); // compute query weight
  55. return queryWeight * queryWeight; // square it
  56. }
  57. public virtual void  Normalize(float queryNorm)
  58. {
  59. this.queryNorm = queryNorm;
  60. queryWeight *= queryNorm; // normalize query weight
  61. value_Renamed = queryWeight * idf; // idf for document
  62. }
  63. public virtual Scorer Scorer(IndexReader reader)
  64. {
  65. return new SpanScorer(query.GetSpans(reader), this, similarity, reader.Norms(query.GetField()));
  66. }
  67. public virtual Explanation Explain(IndexReader reader, int doc)
  68. {
  69. Explanation result = new Explanation();
  70. result.SetDescription("weight(" + GetQuery() + " in " + doc + "), product of:");
  71. System.String field = ((SpanQuery) GetQuery()).GetField();
  72. System.Text.StringBuilder docFreqs = new System.Text.StringBuilder();
  73. System.Collections.IEnumerator i = terms.GetEnumerator();
  74. while (i.MoveNext())
  75. {
  76. Term term = (Term) i.Current;
  77. docFreqs.Append(term.Text());
  78. docFreqs.Append("=");
  79. docFreqs.Append(reader.DocFreq(term));
  80. if (i.MoveNext())
  81. {
  82. docFreqs.Append(" ");
  83. }
  84. }
  85. Explanation idfExpl = new Explanation(idf, "idf(" + field + ": " + docFreqs + ")");
  86. // explain query weight
  87. Explanation queryExpl = new Explanation();
  88. queryExpl.SetDescription("queryWeight(" + GetQuery() + "), product of:");
  89. Explanation boostExpl = new Explanation(GetQuery().GetBoost(), "boost");
  90. if (GetQuery().GetBoost() != 1.0f)
  91. queryExpl.AddDetail(boostExpl);
  92. queryExpl.AddDetail(idfExpl);
  93. Explanation queryNormExpl = new Explanation(queryNorm, "queryNorm");
  94. queryExpl.AddDetail(queryNormExpl);
  95. queryExpl.SetValue(boostExpl.GetValue() * idfExpl.GetValue() * queryNormExpl.GetValue());
  96. result.AddDetail(queryExpl);
  97. // explain field weight
  98. Explanation fieldExpl = new Explanation();
  99. fieldExpl.SetDescription("fieldWeight(" + field + ":" + query.ToString(field) + " in " + doc + "), product of:");
  100. Explanation tfExpl = Scorer(reader).Explain(doc);
  101. fieldExpl.AddDetail(tfExpl);
  102. fieldExpl.AddDetail(idfExpl);
  103. Explanation fieldNormExpl = new Explanation();
  104. byte[] fieldNorms = reader.Norms(field);
  105. float fieldNorm = fieldNorms != null ? Similarity.DecodeNorm(fieldNorms[doc]) : 0.0f;
  106. fieldNormExpl.SetValue(fieldNorm);
  107. fieldNormExpl.SetDescription("fieldNorm(field=" + field + ", doc=" + doc + ")");
  108. fieldExpl.AddDetail(fieldNormExpl);
  109. fieldExpl.SetValue(tfExpl.GetValue() * idfExpl.GetValue() * fieldNormExpl.GetValue());
  110. result.AddDetail(fieldExpl);
  111. // combine them
  112. result.SetValue(queryExpl.GetValue() * fieldExpl.GetValue());
  113. if (queryExpl.GetValue() == 1.0f)
  114. return fieldExpl;
  115. return result;
  116. }
  117. }
  118. }