📄 booleanquery.cs
字号:
// ConjunctionScorer is okay
ConjunctionScorer result = new ConjunctionScorer(similarity);
for (int i = 0; i < weights.Count; i++)
{
Weight w = (Weight) weights[i];
Scorer subScorer = w.Scorer(reader);
if (subScorer == null)
return null;
result.Add(subScorer);
}
return result;
}
// Use good-old BooleanScorer instead.
BooleanScorer result2 = new BooleanScorer(similarity);
for (int i = 0; i < weights.Count; i++)
{
BooleanClause c = (BooleanClause) Enclosing_Instance.clauses[i];
Weight w = (Weight) weights[i];
Scorer subScorer = w.Scorer(reader);
if (subScorer != null)
result2.Add(subScorer, c.IsRequired(), c.IsProhibited());
else if (c.IsRequired())
return null;
}
return result2;
}
public virtual Explanation Explain(IndexReader reader, int doc)
{
int minShouldMatch = Enclosing_Instance.GetMinimumNumberShouldMatch();
ComplexExplanation sumExpl = new ComplexExplanation();
sumExpl.SetDescription("sum of:");
int coord = 0;
int maxCoord = 0;
float sum = 0.0f;
bool fail = false;
int shouldMatchCount = 0;
for (int i = 0; i < weights.Count; i++)
{
BooleanClause c = (BooleanClause) Enclosing_Instance.clauses[i];
Weight w = (Weight) weights[i];
Explanation e = w.Explain(reader, doc);
if (!c.IsProhibited())
maxCoord++;
if (e.IsMatch())
{
if (!c.IsProhibited())
{
sumExpl.AddDetail(e);
sum += e.GetValue();
coord++;
}
else
{
Explanation r = new Explanation(0.0f, "match on prohibited clause (" + c.GetQuery().ToString() + ")");
r.AddDetail(e);
sumExpl.AddDetail(r);
fail = true;
}
if (c.GetOccur().Equals(Occur.SHOULD))
shouldMatchCount++;
}
else if (c.IsRequired())
{
Explanation r = new Explanation(0.0f, "no match on required clause (" + c.GetQuery().ToString() + ")");
r.AddDetail(e);
sumExpl.AddDetail(r);
fail = true;
}
}
if (fail)
{
System.Boolean tempAux = false;
sumExpl.SetMatch(tempAux);
sumExpl.SetValue(0.0f);
sumExpl.SetDescription("Failure to meet condition(s) of required/prohibited clause(s)");
return sumExpl;
}
else if (shouldMatchCount < minShouldMatch)
{
System.Boolean tempAux2 = false;
sumExpl.SetMatch(tempAux2);
sumExpl.SetValue(0.0f);
sumExpl.SetDescription("Failure to match minimum number " + "of optional clauses: " + minShouldMatch);
return sumExpl;
}
sumExpl.SetMatch(0 < coord ? true : false);
sumExpl.SetValue(sum);
float coordFactor = similarity.Coord(coord, maxCoord);
if (coordFactor == 1.0f)
// coord is no-op
return sumExpl;
// eliminate wrapper
else
{
ComplexExplanation result = new ComplexExplanation(sumExpl.IsMatch(), sum * coordFactor, "product of:");
result.AddDetail(sumExpl);
result.AddDetail(new Explanation(coordFactor, "coord(" + coord + "/" + maxCoord + ")"));
return result;
}
}
}
[Serializable]
private class BooleanWeight2 : BooleanWeight
{
private void InitBlock(BooleanQuery enclosingInstance)
{
this.enclosingInstance = enclosingInstance;
}
private BooleanQuery enclosingInstance;
public new BooleanQuery Enclosing_Instance
{
get
{
return enclosingInstance;
}
}
/* Merge into BooleanWeight in case the 1.4 BooleanScorer is dropped */
public BooleanWeight2(BooleanQuery enclosingInstance, Searcher searcher):base(enclosingInstance, searcher)
{
InitBlock(enclosingInstance);
}
/// <returns> An alternative Scorer that uses and provides skipTo(),
/// and scores documents in document number order.
/// </returns>
public override Scorer Scorer(IndexReader reader)
{
BooleanScorer2 result = new BooleanScorer2(similarity, Enclosing_Instance.minNrShouldMatch);
for (int i = 0; i < weights.Count; i++)
{
BooleanClause c = (BooleanClause) Enclosing_Instance.clauses[i];
Weight w = (Weight) weights[i];
Scorer subScorer = w.Scorer(reader);
if (subScorer != null)
result.Add(subScorer, c.IsRequired(), c.IsProhibited());
else if (c.IsRequired())
return null;
}
return result;
}
}
/// <summary>Indicates whether to use good old 1.4 BooleanScorer. </summary>
private static bool useScorer14 = false;
public static void SetUseScorer14(bool use14)
{
useScorer14 = use14;
}
public static bool GetUseScorer14()
{
return useScorer14;
}
protected internal override Weight CreateWeight(Searcher searcher)
{
if (0 < minNrShouldMatch)
{
// :TODO: should we throw an exception if getUseScorer14 ?
return new BooleanWeight2(this, searcher);
}
return GetUseScorer14() ? (Weight) new BooleanWeight(this, searcher) : (Weight) new BooleanWeight2(this, searcher);
}
public override Query Rewrite(IndexReader reader)
{
if (clauses.Count == 1)
{
// optimize 1-clause queries
BooleanClause c = (BooleanClause) clauses[0];
if (!c.IsProhibited())
{
// just return clause
Query query = c.GetQuery().Rewrite(reader); // rewrite first
if (GetBoost() != 1.0f)
{
// incorporate boost
if (query == c.GetQuery())
// if rewrite was no-op
query = (Query) query.Clone(); // then clone before boost
query.SetBoost(GetBoost() * query.GetBoost());
}
return query;
}
}
BooleanQuery clone = null; // recursively rewrite
for (int i = 0; i < clauses.Count; i++)
{
BooleanClause c = (BooleanClause) clauses[i];
Query query = c.GetQuery().Rewrite(reader);
if (query != c.GetQuery())
{
// clause rewrote: must clone
if (clone == null)
clone = (BooleanQuery) this.Clone();
clone.clauses[i] = new BooleanClause(query, c.GetOccur());
}
}
if (clone != null)
{
return clone; // some clauses rewrote
}
else
return this; // no clauses rewrote
}
// inherit javadoc
public override void ExtractTerms(System.Collections.Hashtable terms)
{
for (System.Collections.IEnumerator i = clauses.GetEnumerator(); i.MoveNext(); )
{
BooleanClause clause = (BooleanClause) i.Current;
clause.GetQuery().ExtractTerms(terms);
}
}
public override System.Object Clone()
{
BooleanQuery clone = (BooleanQuery) base.Clone();
clone.clauses = (System.Collections.ArrayList) this.clauses.Clone();
return clone;
}
/// <summary>Prints a user-readable version of this query. </summary>
public override System.String ToString(System.String field)
{
System.Text.StringBuilder buffer = new System.Text.StringBuilder();
bool needParens = (GetBoost() != 1.0) || (GetMinimumNumberShouldMatch() > 0);
if (needParens)
{
buffer.Append("(");
}
for (int i = 0; i < clauses.Count; i++)
{
BooleanClause c = (BooleanClause) clauses[i];
if (c.IsProhibited())
buffer.Append("-");
else if (c.IsRequired())
buffer.Append("+");
Query subQuery = c.GetQuery();
if (subQuery is BooleanQuery)
{
// wrap sub-bools in parens
buffer.Append("(");
buffer.Append(c.GetQuery().ToString(field));
buffer.Append(")");
}
else
buffer.Append(c.GetQuery().ToString(field));
if (i != clauses.Count - 1)
buffer.Append(" ");
}
if (needParens)
{
buffer.Append(")");
}
if (GetMinimumNumberShouldMatch() > 0)
{
buffer.Append('~');
buffer.Append(GetMinimumNumberShouldMatch());
}
if (GetBoost() != 1.0f)
{
buffer.Append(ToStringUtils.Boost(GetBoost()));
}
return buffer.ToString();
}
/// <summary>Returns true iff <code>o</code> is equal to this. </summary>
public override bool Equals(System.Object o)
{
if (!(o is BooleanQuery))
return false;
BooleanQuery other = (BooleanQuery) o;
if (this.GetBoost() != other.GetBoost())
return false;
if (this.clauses.Count != other.clauses.Count)
return false;
for (int i = 0; i < this.clauses.Count; i++)
{
if (this.clauses[i].Equals(other.clauses[i]) == false)
return false;
}
return this.GetMinimumNumberShouldMatch() == other.GetMinimumNumberShouldMatch();
}
/// <summary>Returns a hash code value for this object.</summary>
public override int GetHashCode()
{
int hashCode = 0;
for (int i = 0; i < clauses.Count; i++)
{
hashCode += clauses[i].GetHashCode();
}
return BitConverter.ToInt32(BitConverter.GetBytes(GetBoost()), 0) ^ hashCode + GetMinimumNumberShouldMatch();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -