public override Query VisitPhraseQuery(PhraseQuery phraseq) { _dump.Append("PhraseQ("); var terms = phraseq.GetTerms(); PhraseQuery newQuery = null; int index = 0; int count = terms.Length; while (index < count) { var visitedTerm = VisitTerm(terms[index]); if (newQuery != null) { newQuery.Add(visitedTerm); } else if (visitedTerm != terms[index]) { newQuery = new PhraseQuery(); for (int i = 0; i < index; i++) newQuery.Add(terms[i]); newQuery.Add(visitedTerm); } index++; if (index < count) _dump.Append(", "); } _dump.Append(", Slop:").Append(phraseq.GetSlop()).Append(BoostToString(phraseq)).Append(")"); if (newQuery != null) return newQuery; return phraseq; }
public override Query VisitPhraseQuery(PhraseQuery phraseq) { var terms = phraseq.GetTerms(); var field = terms[0].Field(); _text.Append(field); _text.Append(":\""); var positions = new int[terms.Length]; for (int i = 0; i < positions.Length; i++) positions[i] = i; var pieces = new string[terms.Length]; for (int i = 0; i < terms.Length; i++) { int pos = ((System.Int32)positions[i]); System.String s = pieces[pos]; if (s == null) s = (terms[i]).Text(); else s += "|" + (terms[i]).Text(); pieces[pos] = s; } for (int i = 0; i < pieces.Length; i++) { if (i > 0) _text.Append(' '); System.String s = pieces[i]; if (s == null) _text.Append('?'); else _text.Append(s); } _text.Append("\""); var slop = phraseq.GetSlop(); if (slop != 0) { _text.Append("~"); _text.Append(slop); } _text.Append(BoostToString(phraseq.GetBoost())); return base.VisitPhraseQuery(phraseq); }
/* * Check if PhraseQuery A and B have overlapped part. * * ex1) A="a b", B="b c" => overlap; expandQueries={"a b c"} * ex2) A="b c", B="a b" => overlap; expandQueries={"a b c"} * ex3) A="a b", B="c d" => no overlap; expandQueries={} */ private void CheckOverlap(Dictionary<Query,Query> expandQueries, PhraseQuery a, PhraseQuery b) { if (a.GetSlop() != b.GetSlop()) return; Term[] ats = a.GetTerms(); Term[] bts = b.GetTerms(); if (fieldMatch && !ats[0].Field().Equals(bts[0].Field())) return; CheckOverlap(expandQueries, ats, bts, a.GetSlop(), a.GetBoost()); CheckOverlap(expandQueries, bts, ats, b.GetSlop(), b.GetBoost()); }