package com.tyndalehouse.step.core.data; import java.io.IOException; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.tokenattributes.TermAttribute; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.util.Version; import com.tyndalehouse.step.core.exceptions.StepInternalException; /** * * @author chrisburrell */ public class AnalyzedPrefixSearchQueryParser extends MultiFieldQueryParser { /** * delegates to super constructor * * @param matchVersion the verison of lucene * @param fields the fields * @param analyzer the analyzer */ public AnalyzedPrefixSearchQueryParser(final Version matchVersion, final String[] fields, final Analyzer analyzer) { super(matchVersion, fields, analyzer); } @Override protected org.apache.lucene.search.Query getPrefixQuery(final String field, final String termStr) throws ParseException { TokenStream source; final Analyzer analyzer = super.getAnalyzer(); try { source = analyzer.reusableTokenStream(field, new StringReader(termStr)); source.reset(); final BooleanQuery query = new BooleanQuery(); // now need to consume the stream while (source.incrementToken()) { final TermAttribute attribute = source.getAttribute(TermAttribute.class); final String prefixTerm = attribute.term(); if (prefixTerm.length() != 0) { final org.apache.lucene.search.Query prefixQuery = super .getPrefixQuery(field, prefixTerm); query.add(prefixQuery, Occur.SHOULD); } } return query; } catch (final IOException e) { throw new StepInternalException("Unable to make a prefix query", e); } } }