Index: oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java =================================================================== --- oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java (revision 1682592) +++ oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndex.java (working copy) @@ -31,7 +31,6 @@ import static org.apache.jackrabbit.oak.plugins.index.lucene.TermFactory.newPathTerm; import static org.apache.jackrabbit.oak.plugins.index.lucene.util.LuceneIndexHelper.skipTokenization; import static org.apache.jackrabbit.oak.query.QueryImpl.JCR_PATH; -import static org.apache.jackrabbit.oak.spi.query.QueryIndex.AdvanceFulltextQueryIndex; import static org.apache.lucene.search.BooleanClause.Occur.MUST; import static org.apache.lucene.search.BooleanClause.Occur.MUST_NOT; import static org.apache.lucene.search.BooleanClause.Occur.SHOULD; @@ -48,12 +47,6 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicReference; - -import com.google.common.collect.AbstractIterator; -import com.google.common.collect.Iterables; -import com.google.common.collect.Queues; -import com.google.common.collect.Sets; - import org.apache.jackrabbit.JcrConstants; import org.apache.jackrabbit.oak.api.PropertyValue; import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator; @@ -74,6 +67,7 @@ import org.apache.jackrabbit.oak.spi.query.IndexRow; import org.apache.jackrabbit.oak.spi.query.PropertyValues; import org.apache.jackrabbit.oak.spi.query.QueryIndex; +import org.apache.jackrabbit.oak.spi.query.QueryIndex.AdvanceFulltextQueryIndex; import org.apache.jackrabbit.oak.spi.state.NodeState; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; @@ -85,15 +79,13 @@ import org.apache.lucene.index.MultiFields; import org.apache.lucene.index.StoredFieldVisitor; import org.apache.lucene.index.Term; -import org.apache.lucene.index.Terms; -import org.apache.lucene.index.TermsEnum; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.BooleanClause; +import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.MatchAllDocsQuery; -import org.apache.lucene.search.MultiPhraseQuery; import org.apache.lucene.search.PhraseQuery; import org.apache.lucene.search.PrefixQuery; import org.apache.lucene.search.Query; @@ -103,13 +95,15 @@ import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.WildcardQuery; import org.apache.lucene.search.spell.SuggestWord; -import org.apache.lucene.util.BytesRef; import org.apache.lucene.util.Version; -import org.apache.lucene.util.automaton.Automaton; -import org.apache.lucene.util.automaton.CompiledAutomaton; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.collect.AbstractIterator; +import com.google.common.collect.Iterables; +import com.google.common.collect.Queues; +import com.google.common.collect.Sets; + /** * Provides a QueryIndex that does lookups against a Lucene-based index * @@ -848,18 +842,15 @@ } } else { if (hasFulltextToken(tokens)) { - MultiPhraseQuery mpq = new MultiPhraseQuery(); + BooleanQuery bq = new BooleanQuery(); for(String token: tokens){ if (hasFulltextToken(token)) { - Term[] terms = extractMatchingTokens(reader, fieldName, token); - if (terms != null && terms.length > 0) { - mpq.add(terms); - } + bq.add(new WildcardQuery(newFulltextTerm(token, fieldName)), Occur.MUST); } else { - mpq.add(newFulltextTerm(token, fieldName)); + bq.add(new TermQuery(newFulltextTerm(token, fieldName)), Occur.MUST); } } - return mpq; + return bq; } else { PhraseQuery pq = new PhraseQuery(); for (String t : tokens) { @@ -870,36 +861,6 @@ } } - private static Term[] extractMatchingTokens(IndexReader reader, String fieldName, String token) { - if (reader == null) { - // getPlan call - return null; - } - - try { - List terms = new ArrayList(); - Term onTerm = newFulltextTerm(token, fieldName); - Terms t = MultiFields.getTerms(reader, onTerm.field()); - - //No existing field with given name indexed so no possible term values - if (t == null){ - return new Term[0]; - } - - Automaton a = WildcardQuery.toAutomaton(onTerm); - CompiledAutomaton ca = new CompiledAutomaton(a); - TermsEnum te = ca.getTermsEnum(t); - BytesRef text; - while ((text = te.next()) != null) { - terms.add(newFulltextTerm(text.utf8ToString(), fieldName)); - } - return terms.toArray(new Term[terms.size()]); - } catch (IOException e) { - LOG.error("Building fulltext query failed", e.getMessage()); - return null; - } - } - private static boolean hasFulltextToken(List tokens) { for (String token : tokens) { if (hasFulltextToken(token)) {