Wrapper to allow {@link SpanQuery} objects participate in composite
/// single-field SpanQueries by 'lying' about their search field. That is,
/// the masked SpanQuery will function as normal,
/// but {@link SpanQuery#GetField()} simply hands back the value supplied
/// in this class's constructor.
///
/// This can be used to support Queries like {@link SpanNearQuery} or
/// {@link SpanOrQuery} 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
/// {@link SpanTermQuery} 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 {@link #GetField()} 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 System.String GetField()
{
return field;
}
public virtual SpanQuery GetMaskedQuery()
{
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);
}
///