Terms filter: Add `or` and `or_nocache` execution modes

closes #2306
This commit is contained in:
Shay Banon 2012-10-05 18:21:58 +02:00
parent 9122befdfb
commit 2fa017db11
1 changed files with 33 additions and 0 deletions

View File

@ -25,6 +25,7 @@ import org.apache.lucene.search.Filter;
import org.apache.lucene.search.XTermsFilter;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.lucene.search.AndFilter;
import org.elasticsearch.common.lucene.search.OrFilter;
import org.elasticsearch.common.lucene.search.TermFilter;
import org.elasticsearch.common.lucene.search.XBooleanFilter;
import org.elasticsearch.common.xcontent.XContentParser;
@ -194,6 +195,38 @@ public class TermsFilterParser implements FilterParser {
if (cache == null || cache) {
filter = parseContext.cacheFilter(filter, cacheKey);
}
} else if ("or".equals(execution)) {
List<Filter> filters = Lists.newArrayList();
if (fieldMapper != null) {
for (String term : terms) {
filters.add(parseContext.cacheFilter(fieldMapper.fieldFilter(term, parseContext), null));
}
} else {
for (String term : terms) {
filters.add(parseContext.cacheFilter(new TermFilter(new Term(fieldName, term)), null));
}
}
filter = new OrFilter(filters);
// only cache if explicitly told to, since we cache inner filters
if (cache != null && cache) {
filter = parseContext.cacheFilter(filter, cacheKey);
}
} else if ("or_nocache".equals(execution)) {
List<Filter> filters = Lists.newArrayList();
if (fieldMapper != null) {
for (String term : terms) {
filters.add(fieldMapper.fieldFilter(term, parseContext));
}
} else {
for (String term : terms) {
filters.add(new TermFilter(new Term(fieldName, term)));
}
}
filter = new OrFilter(filters);
// cache the whole filter by default, or if explicitly told to
if (cache == null || cache) {
filter = parseContext.cacheFilter(filter, cacheKey);
}
} else {
throw new QueryParsingException(parseContext.index(), "bool filter execution value [" + execution + "] not supported");
}