Wrapper to allow objects participate in composite
/// single-field SpanQueries by 'lying' about their search field. That is,
/// the masked SpanQuery will function as normal,
/// but simply hands back the value supplied
/// in this class's constructor.
///
/// This can be used to support Queries like or
/// across different fields, which is not ordinarily
/// permitted.
///
/// This can be useful for denormalized relational data: for example, when
/// indexing a document with conceptually many 'children':
///
///
/// teacherid: 1
/// studentfirstname: james
/// studentsurname: jones
///
/// teacherid: 2
/// studenfirstname: james
/// studentsurname: smith
/// studentfirstname: sally
/// studentsurname: jones
///
///
/// a SpanNearQuery with a slop of 0 can be applied across two
/// objects as follows:
///
/// SpanQuery q1 = new SpanTermQuery(new Term("studentfirstname", "james"));
/// SpanQuery q2 = new SpanTermQuery(new Term("studentsurname", "jones"));
/// SpanQuery q2m new FieldMaskingSpanQuery(q2, "studentfirstname");
/// Query q = new SpanNearQuery(new SpanQuery[]{q1, q2m}, -1, false);
///
/// to search for 'studentfirstname:james studentsurname:jones' and find
/// teacherid 1 without matching teacherid 2 (which has a 'james' in position 0
/// and 'jones' in position 1).
///
/// Note: as returns the masked field, scoring will be
/// done using the norms of the field name supplied. This may lead to unexpected
/// scoring behaviour.
///
[Serializable]
public class FieldMaskingSpanQuery:SpanQuery
{
private SpanQuery maskedQuery;
private System.String field;
public FieldMaskingSpanQuery(SpanQuery maskedQuery, System.String maskedField)
{
this.maskedQuery = maskedQuery;
this.field = maskedField;
}
public override string Field
{
get { return field; }
}
public virtual SpanQuery MaskedQuery
{
get { return maskedQuery; }
}
// :NOTE: getBoost and setBoost are not proxied to the maskedQuery
// ...this is done to be more consistent with thigns like SpanFirstQuery
public override Spans GetSpans(IndexReader reader)
{
return maskedQuery.GetSpans(reader);
}
public override void ExtractTerms(System.Collections.Generic.ISet