@Override public BLSpanQuery rewrite(IndexReader reader) throws IOException { FuzzyQuery fuzzyQuery = new FuzzyQuery(term, maxEdits, prefixLength); Query rewrittenFuzzyQuery = fuzzyQuery.rewrite(reader); if (rewrittenFuzzyQuery instanceof BooleanQuery) { // BooleanQuery; make SpanQueries from each of the TermQueries and combine with OR List<BooleanClause> clauses = ((BooleanQuery) rewrittenFuzzyQuery).clauses(); BLSpanQuery[] spanQueries = new BLSpanQuery[clauses.size()]; for (int i = 0; i < clauses.size(); i++) { BooleanClause clause = clauses.get(i); TermQuery termQuery = (TermQuery) clause.getQuery(); // ONLY DIFFERENCE WITH SpanFuzzyQuery: // Use a BLSpanTermQuery instead of default Lucene one. spanQueries[i] = new BLSpanTermQuery(termQuery.getTerm()); } BLSpanOrQuery query = new BLSpanOrQuery(spanQueries); query.setHitsAreFixedLength(1); query.setClausesAreSimpleTermsInSameProperty(true); return query; } // Not a BooleanQuery, just a TermQuery. Convert to a SpanTermQuery. BLSpanQuery query = new BLSpanTermQuery(((TermQuery) rewrittenFuzzyQuery).getTerm()); return query; }