/*
* Copyright (c) 2009 Andrejs Jermakovics.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Andrejs Jermakovics - initial implementation
*/
package it.unibz.instasearch.indexing.querying;
import it.unibz.instasearch.indexing.Field;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.BooleanClause.Occur;
/**
* Converts a boolean query into a phrase query
*/
public class PhraseSearcher extends QueryVisitor
{
/**
*
*/
private static final int DEFAULT_SLOP = 10;
@Override
public BooleanQuery visit(BooleanQuery boolQuery)
{
PhraseQuery phraseQuery = new PhraseQuery();
for(BooleanClause clause: boolQuery.getClauses())
{
if( clause.isProhibited() || !clause.isRequired() || !(clause.getQuery() instanceof TermQuery) )
return super.visit(boolQuery); // only consider required terms
TermQuery tq = (TermQuery) clause.getQuery();
Field field = Field.getByName( tq.getTerm().field() );
if( field != Field.CONTENTS )
continue;
phraseQuery.add(tq.getTerm());
}
phraseQuery.setSlop(DEFAULT_SLOP);
BooleanQuery bq = new BooleanQuery();
bq.add(phraseQuery, Occur.SHOULD);
bq.add(boolQuery, Occur.SHOULD);
bq.setBoost(boolQuery.getBoost());
phraseQuery.setBoost(boolQuery.getBoost());
boolQuery.setBoost( phraseQuery.getBoost()*0.5f );
return bq;
}
}