mirror of
https://github.com/apache/lucene.git
synced 2025-02-18 07:55:29 +00:00
LUCENE-2064: Highlighter support all MultiTermQuery subclasses without explicit casts
git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@836161 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4422d07e8a
commit
b017a2ae13
@ -28,8 +28,10 @@ import java.util.Set;
|
||||
|
||||
import org.apache.lucene.analysis.CachingTokenFilter;
|
||||
import org.apache.lucene.analysis.TokenStream;
|
||||
import org.apache.lucene.index.FilterIndexReader;
|
||||
import org.apache.lucene.index.IndexReader;
|
||||
import org.apache.lucene.index.Term;
|
||||
import org.apache.lucene.index.TermEnum;
|
||||
import org.apache.lucene.index.memory.MemoryIndex;
|
||||
import org.apache.lucene.search.*;
|
||||
import org.apache.lucene.search.spans.FieldMaskingSpanQuery;
|
||||
@ -144,22 +146,14 @@ public class WeightedSpanTermExtractor {
|
||||
} else if (query instanceof MultiTermQuery && expandMultiTermQuery) {
|
||||
MultiTermQuery mtq = ((MultiTermQuery)query);
|
||||
if(mtq.getRewriteMethod() != MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE) {
|
||||
mtq = copyMultiTermQuery(mtq);
|
||||
mtq = (MultiTermQuery) mtq.clone();
|
||||
mtq.setRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE);
|
||||
query = mtq;
|
||||
}
|
||||
String field = null;
|
||||
if(mtq instanceof TermRangeQuery) {
|
||||
field = ((TermRangeQuery)mtq).getField();
|
||||
} else if (mtq instanceof PrefixQuery) {
|
||||
field = ((PrefixQuery) mtq).getPrefix().field();
|
||||
} else if (mtq instanceof WildcardQuery) {
|
||||
field = ((WildcardQuery) mtq).getTerm().field();
|
||||
} else if (mtq instanceof FuzzyQuery) {
|
||||
field = ((FuzzyQuery) mtq).getTerm().field();
|
||||
}
|
||||
if (field != null) {
|
||||
IndexReader ir = getReaderForField(field);
|
||||
FakeReader fReader = new FakeReader();
|
||||
MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE.rewrite(fReader, mtq);
|
||||
if (fReader.field != null) {
|
||||
IndexReader ir = getReaderForField(fReader.field);
|
||||
extract(query.rewrite(ir), terms);
|
||||
}
|
||||
} else if (query instanceof MultiPhraseQuery) {
|
||||
@ -527,29 +521,6 @@ public class WeightedSpanTermExtractor {
|
||||
|
||||
}
|
||||
|
||||
private MultiTermQuery copyMultiTermQuery(MultiTermQuery query) {
|
||||
if(query instanceof TermRangeQuery) {
|
||||
TermRangeQuery q = (TermRangeQuery)query;
|
||||
q.setBoost(query.getBoost());
|
||||
return new TermRangeQuery(q.getField(), q.getLowerTerm(), q.getUpperTerm(), q.includesLower(), q.includesUpper());
|
||||
} else if(query instanceof WildcardQuery) {
|
||||
MultiTermQuery q = new WildcardQuery(((WildcardQuery) query).getTerm());
|
||||
q.setBoost(query.getBoost());
|
||||
return q;
|
||||
} else if(query instanceof PrefixQuery) {
|
||||
MultiTermQuery q = new PrefixQuery(((PrefixQuery) query).getPrefix());
|
||||
q.setBoost(q.getBoost());
|
||||
return q;
|
||||
} else if(query instanceof FuzzyQuery) {
|
||||
FuzzyQuery q = (FuzzyQuery)query;
|
||||
q.setBoost(q.getBoost());
|
||||
return new FuzzyQuery(q.getTerm(), q.getMinSimilarity(), q.getPrefixLength());
|
||||
}
|
||||
|
||||
return query;
|
||||
}
|
||||
|
||||
|
||||
public boolean getExpandMultiTermQuery() {
|
||||
return expandMultiTermQuery;
|
||||
}
|
||||
@ -578,4 +549,49 @@ public class WeightedSpanTermExtractor {
|
||||
public void setWrapIfNotCachingTokenFilter(boolean wrap) {
|
||||
this.wrapToCaching = wrap;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* A fake IndexReader class to extract the field from a MultiTermQuery
|
||||
*
|
||||
*/
|
||||
static final class FakeReader extends FilterIndexReader {
|
||||
|
||||
private static final IndexReader EMPTY_MEMORY_INDEX_READER =
|
||||
new MemoryIndex().createSearcher().getIndexReader();
|
||||
|
||||
String field;
|
||||
|
||||
FakeReader() {
|
||||
super(EMPTY_MEMORY_INDEX_READER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TermEnum terms(Term t) throws IOException {
|
||||
field = t.field();
|
||||
return new TermEnum() {
|
||||
|
||||
@Override
|
||||
public Term term() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean next() throws IOException {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int docFreq() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user