Collection<Query> expand( Collection<Query> flatQueries ){ Set<Query> expandQueries = new HashSet<Query>(); for( Iterator<Query> i = flatQueries.iterator(); i.hasNext(); ){ Query query = i.next(); i.remove(); expandQueries.add( query ); if( !( query instanceof PhraseQuery ) ) continue; for( Iterator<Query> j = flatQueries.iterator(); j.hasNext(); ){ Query qj = j.next(); if( !( qj instanceof PhraseQuery ) ) continue; checkOverlap( expandQueries, (PhraseQuery)query, (PhraseQuery)qj ); } } return expandQueries; }
Collection<Query> expand( Collection<Query> flatQueries ){ Set<Query> expandQueries = new LinkedHashSet<>(); for( Iterator<Query> i = flatQueries.iterator(); i.hasNext(); ){ Query query = i.next(); i.remove(); expandQueries.add( query ); float queryBoost = 1f; while (query instanceof BoostQuery) { BoostQuery bq = (BoostQuery) query; queryBoost *= bq.getBoost(); query = bq.getQuery(); } if( !( query instanceof PhraseQuery ) ) continue; for( Iterator<Query> j = flatQueries.iterator(); j.hasNext(); ){ Query qj = j.next(); float qjBoost = 1f; while (qj instanceof BoostQuery) { BoostQuery bq = (BoostQuery) qj; qjBoost *= bq.getBoost(); qj = bq.getQuery(); } if( !( qj instanceof PhraseQuery ) ) continue; checkOverlap( expandQueries, (PhraseQuery)query, queryBoost, (PhraseQuery)qj, qjBoost ); } } return expandQueries; }
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() ); }