@Override public Query rewrite(IndexReader reader) throws IOException { if (terms.isEmpty()) { Query rewritten = new MatchNoDocsQuery(); rewritten.setBoost(getBoost()); return rewritten; } else if (terms.size() == 1) { TermQuery tq = new TermQuery(terms.get(0)); tq.setBoost(getBoost()); return tq; } else if (positions.get(0).intValue() != 0) { final int[] oldPositions = getPositions(); int[] newPositions = new int[oldPositions.length]; for (int i = 0; i < oldPositions.length; ++i) { newPositions[i] = oldPositions[i] - oldPositions[0]; } PhraseQuery rewritten = new PhraseQuery(slop, getTerms(), newPositions); rewritten.setBoost(getBoost()); return rewritten; } else { return super.rewrite(reader); } }
@Override public Query rewrite(IndexReader reader) throws IOException { if (terms.isEmpty()) { Query rewritten = new MatchNoDocsQuery(); rewritten.setBoost(getBoost()); return rewritten; } else if (terms.size() == 1) { TermQuery tq = new TermQuery(terms.get(0)); tq.setBoost(getBoost()); return tq; } else if (positions.get(0).intValue() != 0) { final int[] oldPositions = getPositions(); int[] newPositions = new int[oldPositions.length]; for (int i = 0; i < oldPositions.length; ++i) { newPositions[i] = oldPositions[i] - oldPositions[0]; } PhraseQuery rewritten = new PhraseQuery(slop, getTerms(), newPositions); rewritten.setBoost(getBoost()); return rewritten; } else { return super.rewrite(reader); } }
private void checkOverlap( Collection<Query> expandQueries, Term[] src, Term[] dest, int slop, float boost ){ // beginning from 1 (not 0) is safe because that the PhraseQuery has multiple terms // is guaranteed in flatten() method (if PhraseQuery has only one term, flatten() // converts PhraseQuery to TermQuery) for( int i = 1; i < src.length; i++ ){ boolean overlap = true; for( int j = i; j < src.length; j++ ){ if( ( j - i ) < dest.length && !src[j].text().equals( dest[j-i].text() ) ){ overlap = false; break; } } if( overlap && src.length - i < dest.length ){ PhraseQuery pq = new PhraseQuery(); for( Term srcTerm : src ) pq.add( srcTerm ); for( int k = src.length - i; k < dest.length; k++ ){ pq.add( new Term( src[0].field(), dest[k].text() ) ); } pq.setSlop( slop ); pq.setBoost( boost ); if(!expandQueries.contains( pq ) ) expandQueries.add( pq ); } } }
query.setBoost(orig.getBoost()); this.flatten(query, reader, flatQueries, orig.getBoost()); } else {
@Override public Query visit(PhraseQuery phraseQuery) { PhraseQuery newQuery = new PhraseQuery(); for(Term term: phraseQuery.getTerms()) { Field field = Field.getByName( term.field() ); if( field != Field.CONTENTS ) return phraseQuery; Term newTerm = Field.CONTENTS.createTerm( term.text().toLowerCase(Locale.ENGLISH) ); newQuery.add( newTerm ); } newQuery.setSlop(phraseQuery.getSlop()); newQuery.setBoost( phraseQuery.getBoost() ); return newQuery; } }
private Query applySlop(Query q, int slop) { if (q instanceof PhraseQuery) { PhraseQuery pq = (PhraseQuery) q; PhraseQuery.Builder builder = new PhraseQuery.Builder(); builder.setSlop(slop); final Term[] terms = pq.getTerms(); final int[] positions = pq.getPositions(); for (int i = 0; i < terms.length; ++i) { builder.add(terms[i], positions[i]); } pq = builder.build(); pq.setBoost(q.getBoost()); return pq; } else if (q instanceof MultiPhraseQuery) { ((MultiPhraseQuery) q).setSlop(slop); return q; } else { return q; } }
q.setBoost(query.getBoost()); return q;
bq.setBoost(boolQuery.getBoost()); phraseQuery.setBoost(boolQuery.getBoost()); boolQuery.setBoost( phraseQuery.getBoost()*0.5f );
PhraseQuery original = (PhraseQuery) query; PhraseQuery replaced = new PhraseQuery(); replaced.setBoost(original.getBoost()); replaced.setSlop(original.getSlop()); Term[] terms = original.getTerms();