@Override public Query rewrite(IndexReader reader) throws IOException { final Term[] terms = phraseQuery.getTerms(); final int[] positions = phraseQuery.getPositions(); boolean isOptimizable = phraseQuery.getSlop() == 0 && n >= 2 // non-overlap n-gram cannot be optimized && terms.length >= 3; // short ones can't be optimized if (isOptimizable) { for (int i = 1; i < positions.length; ++i) { if (positions[i] != positions[i-1] + 1) { isOptimizable = false; break; } } } if (isOptimizable == false) { return phraseQuery.rewrite(reader); } PhraseQuery.Builder builder = new PhraseQuery.Builder(); for (int i = 0; i < terms.length; ++i) { if (i % n == 0 || i == terms.length - 1) { builder.add(terms[i], i); } } return builder.build(); }
private void checkOverlap( Collection<Query> expandQueries, PhraseQuery a, float aBoost, PhraseQuery b, float bBoost ){ 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(), aBoost); checkOverlap( expandQueries, bts, ats, b.getSlop(), bBoost ); }
private void checkOverlap( Collection<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() ); }
private static JsonObject convertPhraseQuery(PhraseQuery query) { Term[] terms = query.getTerms(); if ( terms.length == 0 ) { throw LOG.cannotQueryOnEmptyPhraseQuery(); } String field = terms[0].field(); // phrase queries are only supporting one field StringBuilder phrase = new StringBuilder(); for ( Term term : terms ) { phrase.append( " " ).append( term.text() ); } JsonObject phraseQuery = JsonBuilder.object() .add( "match_phrase", JsonBuilder.object().add( field, JsonBuilder.object() .addProperty( "query", phrase.toString().trim() ) .addProperty( "slop", query.getSlop() ) .addProperty( "boost", query.getBoost() ) ) ).build(); return wrapQueryForNestedIfRequired( field, phraseQuery ); }
protected Query rewritePhraseQuery(PhraseQuery query) throws RewriteException { Term[] terms = query.getTerms(); int[] positions = query.getPositions(); SpanTermQuery[] spanQueries = new SpanTermQuery[positions.length]; for(int i = 0; i < positions.length; i++) { if(positions[i] - positions[0] != i) { // positions must increase by 1 each time (i-1 is safe as the if can't be true for i=0) throw new RewriteException("Don't know how to rewrite PhraseQuery with holes or overlaps " + "(position must increase by 1 each time but found term " + terms[i-1] + " at position " + positions[i-1] + " followed by term " + terms[i] + " at position " + positions[i] + ")", query); } spanQueries[i] = new SpanTermQuery(terms[i]); } return forceOffsets(new SpanNearQuery(spanQueries, query.getSlop(), true)); }
/** * This is best effort only: the PhraseQuery may contain multiple terms at the same position * (think synonyms) or gaps (think stopwords) and it's in this case impossible to translate * it into a correct ElasticsearchQuery. */ private static JsonObject convertPhraseQuery(PhraseQuery query) { Term[] terms = query.getTerms(); if ( terms.length == 0 ) { throw LOG.cannotQueryOnEmptyPhraseQuery(); } String field = terms[0].field(); // phrase queries are only supporting one field StringBuilder phrase = new StringBuilder(); for ( Term term : terms ) { phrase.append( " " ).append( term.text() ); } JsonObject phraseQuery = JsonBuilder.object() .add( "match_phrase", JsonBuilder.object().add( field, JsonBuilder.object() .addProperty( "query", phrase.toString().trim() ) .append( slopAppender( query.getSlop() ) ) .append( boostAppender( query ) ) ) ).build(); return wrapQueryForNestedIfRequired( field, phraseQuery ); }
/** * This is best effort only: the PhraseQuery may contain multiple terms at the same position * (think synonyms) or gaps (think stopwords) and it's in this case impossible to translate * it into a correct ElasticsearchQuery. */ private static JsonObject convertPhraseQuery(PhraseQuery query) { Term[] terms = query.getTerms(); if ( terms.length == 0 ) { throw LOG.cannotQueryOnEmptyPhraseQuery(); } String field = terms[0].field(); // phrase queries are only supporting one field StringBuilder phrase = new StringBuilder(); for ( Term term : terms ) { phrase.append( " " ).append( term.text() ); } JsonObject phraseQuery = JsonBuilder.object() .add( "match_phrase", JsonBuilder.object().add( field, JsonBuilder.object() .addProperty( "query", phrase.toString().trim() ) .append( slopAppender( query.getSlop() ) ) .append( boostAppender( query ) ) ) ).build(); return wrapQueryForNestedIfRequired( field, phraseQuery ); }
void add( Query query ){ if( query instanceof TermQuery ){ addTerm( ((TermQuery)query).getTerm(), query.getBoost() ); } else if( query instanceof PhraseQuery ){ PhraseQuery pq = (PhraseQuery)query; Term[] terms = pq.getTerms(); Map<String, QueryPhraseMap> map = subMap; QueryPhraseMap qpm = null; for( Term term : terms ){ qpm = getOrNewMap( map, term.text() ); map = qpm.subMap; } qpm.markTerminal( pq.getSlop(), pq.getBoost() ); } else throw new RuntimeException( "query \"" + query.toString() + "\" must be flatten first." ); }
@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; } }
@Override public Query rewrite(IndexReader reader) throws IOException { final Term[] terms = phraseQuery.getTerms(); final int[] positions = phraseQuery.getPositions(); boolean isOptimizable = phraseQuery.getSlop() == 0 && n >= 2 // non-overlap n-gram cannot be optimized && terms.length >= 3; // short ones can't be optimized if (isOptimizable) { for (int i = 1; i < positions.length; ++i) { if (positions[i] != positions[i-1] + 1) { isOptimizable = false; break; } } } if (isOptimizable == false) { return phraseQuery.rewrite(reader); } PhraseQuery.Builder builder = new PhraseQuery.Builder(); for (int i = 0; i < terms.length; ++i) { if (i % n == 0 || i == terms.length - 1) { builder.add(terms[i], i); } } return builder.build(); }
void add( Query query, IndexReader reader ) { float boost = 1f; while (query instanceof BoostQuery) { BoostQuery bq = (BoostQuery) query; query = bq.getQuery(); boost = bq.getBoost(); } if( query instanceof TermQuery ){ addTerm( ((TermQuery)query).getTerm(), boost ); } else if( query instanceof PhraseQuery ){ PhraseQuery pq = (PhraseQuery)query; Term[] terms = pq.getTerms(); Map<String, QueryPhraseMap> map = subMap; QueryPhraseMap qpm = null; for( Term term : terms ){ qpm = getOrNewMap( map, term.text() ); map = qpm.subMap; } qpm.markTerminal( pq.getSlop(), boost ); } else throw new RuntimeException( "query \"" + query.toString() + "\" must be flatten first." ); }
int slop = ((PhraseQuery) query).getSlop(); boolean inorder = false;
int slop = ((PhraseQuery) query).getSlop(); boolean inorder = false;
@Override public Query rewrite(IndexReader reader) throws IOException { if (getBoost() != 1f) { return super.rewrite(reader); } final Term[] terms = phraseQuery.getTerms(); final int[] positions = phraseQuery.getPositions(); boolean isOptimizable = phraseQuery.getSlop() == 0 && n >= 2 // non-overlap n-gram cannot be optimized && terms.length >= 3; // short ones can't be optimized if (isOptimizable) { for (int i = 1; i < positions.length; ++i) { if (positions[i] != positions[i-1] + 1) { isOptimizable = false; break; } } } if (isOptimizable == false) { return phraseQuery.rewrite(reader); } PhraseQuery.Builder builder = new PhraseQuery.Builder(); for (int i = 0; i < terms.length; ++i) { if (i % n == 0 || i == terms.length - 1) { builder.add(terms[i], i); } } return builder.build(); }
@Override public Query rewrite(IndexReader reader) throws IOException { if (getBoost() != 1f) { return super.rewrite(reader); } final Term[] terms = phraseQuery.getTerms(); final int[] positions = phraseQuery.getPositions(); boolean isOptimizable = phraseQuery.getSlop() == 0 && n >= 2 // non-overlap n-gram cannot be optimized && terms.length >= 3; // short ones can't be optimized if (isOptimizable) { for (int i = 1; i < positions.length; ++i) { if (positions[i] != positions[i-1] + 1) { isOptimizable = false; break; } } } if (isOptimizable == false) { return phraseQuery.rewrite(reader); } PhraseQuery.Builder builder = new PhraseQuery.Builder(); for (int i = 0; i < terms.length; ++i) { if (i % n == 0 || i == terms.length - 1) { builder.add(terms[i], i); } } return builder.build(); }
protected void flattenQuery(PhraseQuery query, float pathBoost, Object sourceOverride, IndexReader reader, Callback callback) { Term[] terms = query.getTerms(); if (terms.length == 0) { return; } if (phraseAsTerms) { for (Term term : terms) { callback.flattened(term.bytes(), pathBoost, sourceOverride); } } else { callback.startPhrase(terms.length, pathBoost); for (Term term : terms) { callback.startPhrasePosition(1); callback.flattened(term.bytes(), 0, sourceOverride); callback.endPhrasePosition(); } callback.endPhrase(terms[0].field(), query.getSlop(), pathBoost); } }
int slop = ((PhraseQuery) query).getSlop(); boolean inorder = false;
int slop = ((PhraseQuery) query).getSlop(); boolean inorder = false;
q.add(t.equals(original)? replacement : t); q.setSlop(query.getSlop()); q.setBoost(query.getBoost()); return q;
PhraseQuery replaced = new PhraseQuery(); replaced.setBoost(original.getBoost()); replaced.setSlop(original.getSlop()); Term[] terms = original.getTerms(); int[] positions = original.getPositions();