"exclude" functionality missing for terms facet on numeric fields, closes #789.
This commit is contained in:
parent
923fcf239c
commit
09fbc919b8
|
@ -39,7 +39,7 @@ public class TermsFacetBuilder extends AbstractFacetBuilder {
|
||||||
private String[] fieldsNames;
|
private String[] fieldsNames;
|
||||||
private int size = 10;
|
private int size = 10;
|
||||||
private Boolean allTerms;
|
private Boolean allTerms;
|
||||||
private String[] exclude;
|
private Object[] exclude;
|
||||||
private String regex;
|
private String regex;
|
||||||
private int regexFlags = 0;
|
private int regexFlags = 0;
|
||||||
private TermsFacet.ComparatorType comparatorType;
|
private TermsFacet.ComparatorType comparatorType;
|
||||||
|
@ -110,7 +110,7 @@ public class TermsFacetBuilder extends AbstractFacetBuilder {
|
||||||
/**
|
/**
|
||||||
* A set of terms that will be excluded.
|
* A set of terms that will be excluded.
|
||||||
*/
|
*/
|
||||||
public TermsFacetBuilder exclude(String... exclude) {
|
public TermsFacetBuilder exclude(Object... exclude) {
|
||||||
this.exclude = exclude;
|
this.exclude = exclude;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -205,7 +205,7 @@ public class TermsFacetBuilder extends AbstractFacetBuilder {
|
||||||
builder.field("size", size);
|
builder.field("size", size);
|
||||||
if (exclude != null) {
|
if (exclude != null) {
|
||||||
builder.startArray("exclude");
|
builder.startArray("exclude");
|
||||||
for (String ex : exclude) {
|
for (Object ex : exclude) {
|
||||||
builder.value(ex);
|
builder.value(ex);
|
||||||
}
|
}
|
||||||
builder.endArray();
|
builder.endArray();
|
||||||
|
|
|
@ -144,17 +144,17 @@ public class TermsFacetProcessor extends AbstractComponent implements FacetProce
|
||||||
if (fieldMapper instanceof IpFieldMapper) {
|
if (fieldMapper instanceof IpFieldMapper) {
|
||||||
return new TermsIpFacetCollector(facetName, field, size, comparatorType, allTerms, context, scriptLang, script, params);
|
return new TermsIpFacetCollector(facetName, field, size, comparatorType, allTerms, context, scriptLang, script, params);
|
||||||
} else if (fieldMapper.fieldDataType() == FieldDataType.DefaultTypes.LONG) {
|
} else if (fieldMapper.fieldDataType() == FieldDataType.DefaultTypes.LONG) {
|
||||||
return new TermsLongFacetCollector(facetName, field, size, comparatorType, allTerms, context, scriptLang, script, params);
|
return new TermsLongFacetCollector(facetName, field, size, comparatorType, allTerms, context, excluded, scriptLang, script, params);
|
||||||
} else if (fieldMapper.fieldDataType() == FieldDataType.DefaultTypes.DOUBLE) {
|
} else if (fieldMapper.fieldDataType() == FieldDataType.DefaultTypes.DOUBLE) {
|
||||||
return new TermsDoubleFacetCollector(facetName, field, size, comparatorType, allTerms, context, scriptLang, script, params);
|
return new TermsDoubleFacetCollector(facetName, field, size, comparatorType, allTerms, context, excluded, scriptLang, script, params);
|
||||||
} else if (fieldMapper.fieldDataType() == FieldDataType.DefaultTypes.INT) {
|
} else if (fieldMapper.fieldDataType() == FieldDataType.DefaultTypes.INT) {
|
||||||
return new TermsIntFacetCollector(facetName, field, size, comparatorType, allTerms, context, scriptLang, script, params);
|
return new TermsIntFacetCollector(facetName, field, size, comparatorType, allTerms, context, excluded, scriptLang, script, params);
|
||||||
} else if (fieldMapper.fieldDataType() == FieldDataType.DefaultTypes.FLOAT) {
|
} else if (fieldMapper.fieldDataType() == FieldDataType.DefaultTypes.FLOAT) {
|
||||||
return new TermsFloatFacetCollector(facetName, field, size, comparatorType, allTerms, context, scriptLang, script, params);
|
return new TermsFloatFacetCollector(facetName, field, size, comparatorType, allTerms, context, excluded, scriptLang, script, params);
|
||||||
} else if (fieldMapper.fieldDataType() == FieldDataType.DefaultTypes.SHORT) {
|
} else if (fieldMapper.fieldDataType() == FieldDataType.DefaultTypes.SHORT) {
|
||||||
return new TermsShortFacetCollector(facetName, field, size, comparatorType, allTerms, context, scriptLang, script, params);
|
return new TermsShortFacetCollector(facetName, field, size, comparatorType, allTerms, context, excluded, scriptLang, script, params);
|
||||||
} else if (fieldMapper.fieldDataType() == FieldDataType.DefaultTypes.BYTE) {
|
} else if (fieldMapper.fieldDataType() == FieldDataType.DefaultTypes.BYTE) {
|
||||||
return new TermsByteFacetCollector(facetName, field, size, comparatorType, allTerms, context, scriptLang, script, params);
|
return new TermsByteFacetCollector(facetName, field, size, comparatorType, allTerms, context, excluded, scriptLang, script, params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new TermsStringFacetCollector(facetName, field, size, comparatorType, allTerms, context, excluded, pattern, scriptLang, script, params);
|
return new TermsStringFacetCollector(facetName, field, size, comparatorType, allTerms, context, excluded, pattern, scriptLang, script, params);
|
||||||
|
|
|
@ -24,9 +24,11 @@ import org.apache.lucene.search.Scorer;
|
||||||
import org.elasticsearch.ElasticSearchIllegalArgumentException;
|
import org.elasticsearch.ElasticSearchIllegalArgumentException;
|
||||||
import org.elasticsearch.common.collect.BoundedTreeSet;
|
import org.elasticsearch.common.collect.BoundedTreeSet;
|
||||||
import org.elasticsearch.common.collect.ImmutableList;
|
import org.elasticsearch.common.collect.ImmutableList;
|
||||||
|
import org.elasticsearch.common.collect.ImmutableSet;
|
||||||
import org.elasticsearch.common.thread.ThreadLocals;
|
import org.elasticsearch.common.thread.ThreadLocals;
|
||||||
import org.elasticsearch.common.trove.iterator.TByteIntIterator;
|
import org.elasticsearch.common.trove.iterator.TByteIntIterator;
|
||||||
import org.elasticsearch.common.trove.map.hash.TByteIntHashMap;
|
import org.elasticsearch.common.trove.map.hash.TByteIntHashMap;
|
||||||
|
import org.elasticsearch.common.trove.set.hash.TByteHashSet;
|
||||||
import org.elasticsearch.index.cache.field.data.FieldDataCache;
|
import org.elasticsearch.index.cache.field.data.FieldDataCache;
|
||||||
import org.elasticsearch.index.field.data.FieldDataType;
|
import org.elasticsearch.index.field.data.FieldDataType;
|
||||||
import org.elasticsearch.index.field.data.bytes.ByteFieldData;
|
import org.elasticsearch.index.field.data.bytes.ByteFieldData;
|
||||||
|
@ -42,6 +44,7 @@ import java.io.IOException;
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
import java.util.Deque;
|
import java.util.Deque;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author kimchy (shay.banon)
|
* @author kimchy (shay.banon)
|
||||||
|
@ -73,7 +76,7 @@ public class TermsByteFacetCollector extends AbstractFacetCollector {
|
||||||
private final SearchScript script;
|
private final SearchScript script;
|
||||||
|
|
||||||
public TermsByteFacetCollector(String facetName, String fieldName, int size, TermsFacet.ComparatorType comparatorType, boolean allTerms, SearchContext context,
|
public TermsByteFacetCollector(String facetName, String fieldName, int size, TermsFacet.ComparatorType comparatorType, boolean allTerms, SearchContext context,
|
||||||
String scriptLang, String script, Map<String, Object> params) {
|
ImmutableSet<String> excluded, String scriptLang, String script, Map<String, Object> params) {
|
||||||
super(facetName);
|
super(facetName);
|
||||||
this.fieldDataCache = context.fieldDataCache();
|
this.fieldDataCache = context.fieldDataCache();
|
||||||
this.size = size;
|
this.size = size;
|
||||||
|
@ -103,10 +106,10 @@ public class TermsByteFacetCollector extends AbstractFacetCollector {
|
||||||
this.script = null;
|
this.script = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.script == null) {
|
if (this.script == null && excluded.isEmpty()) {
|
||||||
aggregator = new StaticAggregatorValueProc(popFacets());
|
aggregator = new StaticAggregatorValueProc(popFacets());
|
||||||
} else {
|
} else {
|
||||||
aggregator = new AggregatorValueProc(popFacets(), this.script);
|
aggregator = new AggregatorValueProc(popFacets(), excluded, this.script);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allTerms) {
|
if (allTerms) {
|
||||||
|
@ -177,12 +180,25 @@ public class TermsByteFacetCollector extends AbstractFacetCollector {
|
||||||
|
|
||||||
private final SearchScript script;
|
private final SearchScript script;
|
||||||
|
|
||||||
public AggregatorValueProc(TByteIntHashMap facets, SearchScript script) {
|
private final TByteHashSet excluded;
|
||||||
|
|
||||||
|
public AggregatorValueProc(TByteIntHashMap facets, Set<String> excluded, SearchScript script) {
|
||||||
super(facets);
|
super(facets);
|
||||||
|
if (excluded == null || excluded.isEmpty()) {
|
||||||
|
this.excluded = null;
|
||||||
|
} else {
|
||||||
|
this.excluded = new TByteHashSet(excluded.size());
|
||||||
|
for (String s : excluded) {
|
||||||
|
this.excluded.add(Byte.parseByte(s));
|
||||||
|
}
|
||||||
|
}
|
||||||
this.script = script;
|
this.script = script;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onValue(int docId, byte value) {
|
@Override public void onValue(int docId, byte value) {
|
||||||
|
if (excluded != null && excluded.contains(value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (script != null) {
|
if (script != null) {
|
||||||
script.setNextDocId(docId);
|
script.setNextDocId(docId);
|
||||||
script.setNextVar("term", value);
|
script.setNextVar("term", value);
|
||||||
|
|
|
@ -24,9 +24,11 @@ import org.apache.lucene.search.Scorer;
|
||||||
import org.elasticsearch.ElasticSearchIllegalArgumentException;
|
import org.elasticsearch.ElasticSearchIllegalArgumentException;
|
||||||
import org.elasticsearch.common.collect.BoundedTreeSet;
|
import org.elasticsearch.common.collect.BoundedTreeSet;
|
||||||
import org.elasticsearch.common.collect.ImmutableList;
|
import org.elasticsearch.common.collect.ImmutableList;
|
||||||
|
import org.elasticsearch.common.collect.ImmutableSet;
|
||||||
import org.elasticsearch.common.thread.ThreadLocals;
|
import org.elasticsearch.common.thread.ThreadLocals;
|
||||||
import org.elasticsearch.common.trove.iterator.TDoubleIntIterator;
|
import org.elasticsearch.common.trove.iterator.TDoubleIntIterator;
|
||||||
import org.elasticsearch.common.trove.map.hash.TDoubleIntHashMap;
|
import org.elasticsearch.common.trove.map.hash.TDoubleIntHashMap;
|
||||||
|
import org.elasticsearch.common.trove.set.hash.TDoubleHashSet;
|
||||||
import org.elasticsearch.index.cache.field.data.FieldDataCache;
|
import org.elasticsearch.index.cache.field.data.FieldDataCache;
|
||||||
import org.elasticsearch.index.field.data.FieldDataType;
|
import org.elasticsearch.index.field.data.FieldDataType;
|
||||||
import org.elasticsearch.index.field.data.doubles.DoubleFieldData;
|
import org.elasticsearch.index.field.data.doubles.DoubleFieldData;
|
||||||
|
@ -42,6 +44,7 @@ import java.io.IOException;
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
import java.util.Deque;
|
import java.util.Deque;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author kimchy (shay.banon)
|
* @author kimchy (shay.banon)
|
||||||
|
@ -73,7 +76,7 @@ public class TermsDoubleFacetCollector extends AbstractFacetCollector {
|
||||||
private final SearchScript script;
|
private final SearchScript script;
|
||||||
|
|
||||||
public TermsDoubleFacetCollector(String facetName, String fieldName, int size, TermsFacet.ComparatorType comparatorType, boolean allTerms, SearchContext context,
|
public TermsDoubleFacetCollector(String facetName, String fieldName, int size, TermsFacet.ComparatorType comparatorType, boolean allTerms, SearchContext context,
|
||||||
String scriptLang, String script, Map<String, Object> params) {
|
ImmutableSet<String> excluded, String scriptLang, String script, Map<String, Object> params) {
|
||||||
super(facetName);
|
super(facetName);
|
||||||
this.fieldDataCache = context.fieldDataCache();
|
this.fieldDataCache = context.fieldDataCache();
|
||||||
this.size = size;
|
this.size = size;
|
||||||
|
@ -103,10 +106,10 @@ public class TermsDoubleFacetCollector extends AbstractFacetCollector {
|
||||||
this.script = null;
|
this.script = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.script == null) {
|
if (this.script == null && excluded.isEmpty()) {
|
||||||
aggregator = new StaticAggregatorValueProc(popFacets());
|
aggregator = new StaticAggregatorValueProc(popFacets());
|
||||||
} else {
|
} else {
|
||||||
aggregator = new AggregatorValueProc(popFacets(), this.script);
|
aggregator = new AggregatorValueProc(popFacets(), excluded, this.script);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allTerms) {
|
if (allTerms) {
|
||||||
|
@ -177,12 +180,25 @@ public class TermsDoubleFacetCollector extends AbstractFacetCollector {
|
||||||
|
|
||||||
private final SearchScript script;
|
private final SearchScript script;
|
||||||
|
|
||||||
public AggregatorValueProc(TDoubleIntHashMap facets, SearchScript script) {
|
private final TDoubleHashSet excluded;
|
||||||
|
|
||||||
|
public AggregatorValueProc(TDoubleIntHashMap facets, Set<String> excluded, SearchScript script) {
|
||||||
super(facets);
|
super(facets);
|
||||||
this.script = script;
|
this.script = script;
|
||||||
|
if (excluded == null || excluded.isEmpty()) {
|
||||||
|
this.excluded = null;
|
||||||
|
} else {
|
||||||
|
this.excluded = new TDoubleHashSet(excluded.size());
|
||||||
|
for (String s : excluded) {
|
||||||
|
this.excluded.add(Double.parseDouble(s));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onValue(int docId, double value) {
|
@Override public void onValue(int docId, double value) {
|
||||||
|
if (excluded != null && excluded.contains(value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (script != null) {
|
if (script != null) {
|
||||||
script.setNextDocId(docId);
|
script.setNextDocId(docId);
|
||||||
script.setNextVar("term", value);
|
script.setNextVar("term", value);
|
||||||
|
|
|
@ -24,9 +24,11 @@ import org.apache.lucene.search.Scorer;
|
||||||
import org.elasticsearch.ElasticSearchIllegalArgumentException;
|
import org.elasticsearch.ElasticSearchIllegalArgumentException;
|
||||||
import org.elasticsearch.common.collect.BoundedTreeSet;
|
import org.elasticsearch.common.collect.BoundedTreeSet;
|
||||||
import org.elasticsearch.common.collect.ImmutableList;
|
import org.elasticsearch.common.collect.ImmutableList;
|
||||||
|
import org.elasticsearch.common.collect.ImmutableSet;
|
||||||
import org.elasticsearch.common.thread.ThreadLocals;
|
import org.elasticsearch.common.thread.ThreadLocals;
|
||||||
import org.elasticsearch.common.trove.iterator.TFloatIntIterator;
|
import org.elasticsearch.common.trove.iterator.TFloatIntIterator;
|
||||||
import org.elasticsearch.common.trove.map.hash.TFloatIntHashMap;
|
import org.elasticsearch.common.trove.map.hash.TFloatIntHashMap;
|
||||||
|
import org.elasticsearch.common.trove.set.hash.TFloatHashSet;
|
||||||
import org.elasticsearch.index.cache.field.data.FieldDataCache;
|
import org.elasticsearch.index.cache.field.data.FieldDataCache;
|
||||||
import org.elasticsearch.index.field.data.FieldDataType;
|
import org.elasticsearch.index.field.data.FieldDataType;
|
||||||
import org.elasticsearch.index.field.data.floats.FloatFieldData;
|
import org.elasticsearch.index.field.data.floats.FloatFieldData;
|
||||||
|
@ -42,6 +44,7 @@ import java.io.IOException;
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
import java.util.Deque;
|
import java.util.Deque;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author kimchy (shay.banon)
|
* @author kimchy (shay.banon)
|
||||||
|
@ -73,7 +76,7 @@ public class TermsFloatFacetCollector extends AbstractFacetCollector {
|
||||||
private final SearchScript script;
|
private final SearchScript script;
|
||||||
|
|
||||||
public TermsFloatFacetCollector(String facetName, String fieldName, int size, TermsFacet.ComparatorType comparatorType, boolean allTerms, SearchContext context,
|
public TermsFloatFacetCollector(String facetName, String fieldName, int size, TermsFacet.ComparatorType comparatorType, boolean allTerms, SearchContext context,
|
||||||
String scriptLang, String script, Map<String, Object> params) {
|
ImmutableSet<String> excluded, String scriptLang, String script, Map<String, Object> params) {
|
||||||
super(facetName);
|
super(facetName);
|
||||||
this.fieldDataCache = context.fieldDataCache();
|
this.fieldDataCache = context.fieldDataCache();
|
||||||
this.size = size;
|
this.size = size;
|
||||||
|
@ -103,10 +106,10 @@ public class TermsFloatFacetCollector extends AbstractFacetCollector {
|
||||||
this.script = null;
|
this.script = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.script == null) {
|
if (this.script == null && excluded.isEmpty()) {
|
||||||
aggregator = new StaticAggregatorValueProc(popFacets());
|
aggregator = new StaticAggregatorValueProc(popFacets());
|
||||||
} else {
|
} else {
|
||||||
aggregator = new AggregatorValueProc(popFacets(), this.script);
|
aggregator = new AggregatorValueProc(popFacets(), excluded, this.script);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allTerms) {
|
if (allTerms) {
|
||||||
|
@ -177,12 +180,25 @@ public class TermsFloatFacetCollector extends AbstractFacetCollector {
|
||||||
|
|
||||||
private final SearchScript script;
|
private final SearchScript script;
|
||||||
|
|
||||||
public AggregatorValueProc(TFloatIntHashMap facets, SearchScript script) {
|
private final TFloatHashSet excluded;
|
||||||
|
|
||||||
|
public AggregatorValueProc(TFloatIntHashMap facets, Set<String> excluded, SearchScript script) {
|
||||||
super(facets);
|
super(facets);
|
||||||
|
if (excluded == null || excluded.isEmpty()) {
|
||||||
|
this.excluded = null;
|
||||||
|
} else {
|
||||||
|
this.excluded = new TFloatHashSet(excluded.size());
|
||||||
|
for (String s : excluded) {
|
||||||
|
this.excluded.add(Float.parseFloat(s));
|
||||||
|
}
|
||||||
|
}
|
||||||
this.script = script;
|
this.script = script;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onValue(int docId, float value) {
|
@Override public void onValue(int docId, float value) {
|
||||||
|
if (excluded != null && excluded.contains(value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (script != null) {
|
if (script != null) {
|
||||||
script.setNextDocId(docId);
|
script.setNextDocId(docId);
|
||||||
script.setNextVar("term", value);
|
script.setNextVar("term", value);
|
||||||
|
|
|
@ -24,9 +24,11 @@ import org.apache.lucene.search.Scorer;
|
||||||
import org.elasticsearch.ElasticSearchIllegalArgumentException;
|
import org.elasticsearch.ElasticSearchIllegalArgumentException;
|
||||||
import org.elasticsearch.common.collect.BoundedTreeSet;
|
import org.elasticsearch.common.collect.BoundedTreeSet;
|
||||||
import org.elasticsearch.common.collect.ImmutableList;
|
import org.elasticsearch.common.collect.ImmutableList;
|
||||||
|
import org.elasticsearch.common.collect.ImmutableSet;
|
||||||
import org.elasticsearch.common.thread.ThreadLocals;
|
import org.elasticsearch.common.thread.ThreadLocals;
|
||||||
import org.elasticsearch.common.trove.iterator.TIntIntIterator;
|
import org.elasticsearch.common.trove.iterator.TIntIntIterator;
|
||||||
import org.elasticsearch.common.trove.map.hash.TIntIntHashMap;
|
import org.elasticsearch.common.trove.map.hash.TIntIntHashMap;
|
||||||
|
import org.elasticsearch.common.trove.set.hash.TIntHashSet;
|
||||||
import org.elasticsearch.index.cache.field.data.FieldDataCache;
|
import org.elasticsearch.index.cache.field.data.FieldDataCache;
|
||||||
import org.elasticsearch.index.field.data.FieldDataType;
|
import org.elasticsearch.index.field.data.FieldDataType;
|
||||||
import org.elasticsearch.index.field.data.ints.IntFieldData;
|
import org.elasticsearch.index.field.data.ints.IntFieldData;
|
||||||
|
@ -42,6 +44,7 @@ import java.io.IOException;
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
import java.util.Deque;
|
import java.util.Deque;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author kimchy (shay.banon)
|
* @author kimchy (shay.banon)
|
||||||
|
@ -73,7 +76,7 @@ public class TermsIntFacetCollector extends AbstractFacetCollector {
|
||||||
private final SearchScript script;
|
private final SearchScript script;
|
||||||
|
|
||||||
public TermsIntFacetCollector(String facetName, String fieldName, int size, TermsFacet.ComparatorType comparatorType, boolean allTerms, SearchContext context,
|
public TermsIntFacetCollector(String facetName, String fieldName, int size, TermsFacet.ComparatorType comparatorType, boolean allTerms, SearchContext context,
|
||||||
String scriptLang, String script, Map<String, Object> params) {
|
ImmutableSet<String> excluded, String scriptLang, String script, Map<String, Object> params) {
|
||||||
super(facetName);
|
super(facetName);
|
||||||
this.fieldDataCache = context.fieldDataCache();
|
this.fieldDataCache = context.fieldDataCache();
|
||||||
this.size = size;
|
this.size = size;
|
||||||
|
@ -103,10 +106,10 @@ public class TermsIntFacetCollector extends AbstractFacetCollector {
|
||||||
this.script = null;
|
this.script = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.script == null) {
|
if (this.script == null && excluded.isEmpty()) {
|
||||||
aggregator = new StaticAggregatorValueProc(popFacets());
|
aggregator = new StaticAggregatorValueProc(popFacets());
|
||||||
} else {
|
} else {
|
||||||
aggregator = new AggregatorValueProc(popFacets(), this.script);
|
aggregator = new AggregatorValueProc(popFacets(), excluded, this.script);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allTerms) {
|
if (allTerms) {
|
||||||
|
@ -177,12 +180,25 @@ public class TermsIntFacetCollector extends AbstractFacetCollector {
|
||||||
|
|
||||||
private final SearchScript script;
|
private final SearchScript script;
|
||||||
|
|
||||||
public AggregatorValueProc(TIntIntHashMap facets, SearchScript script) {
|
private final TIntHashSet excluded;
|
||||||
|
|
||||||
|
public AggregatorValueProc(TIntIntHashMap facets, Set<String> excluded, SearchScript script) {
|
||||||
super(facets);
|
super(facets);
|
||||||
|
if (excluded == null || excluded.isEmpty()) {
|
||||||
|
this.excluded = null;
|
||||||
|
} else {
|
||||||
|
this.excluded = new TIntHashSet(excluded.size());
|
||||||
|
for (String s : excluded) {
|
||||||
|
this.excluded.add(Integer.parseInt(s));
|
||||||
|
}
|
||||||
|
}
|
||||||
this.script = script;
|
this.script = script;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onValue(int docId, int value) {
|
@Override public void onValue(int docId, int value) {
|
||||||
|
if (excluded != null && excluded.contains(value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (script != null) {
|
if (script != null) {
|
||||||
script.setNextDocId(docId);
|
script.setNextDocId(docId);
|
||||||
script.setNextVar("term", value);
|
script.setNextVar("term", value);
|
||||||
|
|
|
@ -24,9 +24,11 @@ import org.apache.lucene.search.Scorer;
|
||||||
import org.elasticsearch.ElasticSearchIllegalArgumentException;
|
import org.elasticsearch.ElasticSearchIllegalArgumentException;
|
||||||
import org.elasticsearch.common.collect.BoundedTreeSet;
|
import org.elasticsearch.common.collect.BoundedTreeSet;
|
||||||
import org.elasticsearch.common.collect.ImmutableList;
|
import org.elasticsearch.common.collect.ImmutableList;
|
||||||
|
import org.elasticsearch.common.collect.ImmutableSet;
|
||||||
import org.elasticsearch.common.thread.ThreadLocals;
|
import org.elasticsearch.common.thread.ThreadLocals;
|
||||||
import org.elasticsearch.common.trove.iterator.TLongIntIterator;
|
import org.elasticsearch.common.trove.iterator.TLongIntIterator;
|
||||||
import org.elasticsearch.common.trove.map.hash.TLongIntHashMap;
|
import org.elasticsearch.common.trove.map.hash.TLongIntHashMap;
|
||||||
|
import org.elasticsearch.common.trove.set.hash.TLongHashSet;
|
||||||
import org.elasticsearch.index.cache.field.data.FieldDataCache;
|
import org.elasticsearch.index.cache.field.data.FieldDataCache;
|
||||||
import org.elasticsearch.index.field.data.FieldDataType;
|
import org.elasticsearch.index.field.data.FieldDataType;
|
||||||
import org.elasticsearch.index.field.data.longs.LongFieldData;
|
import org.elasticsearch.index.field.data.longs.LongFieldData;
|
||||||
|
@ -42,6 +44,7 @@ import java.io.IOException;
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
import java.util.Deque;
|
import java.util.Deque;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author kimchy (shay.banon)
|
* @author kimchy (shay.banon)
|
||||||
|
@ -74,7 +77,7 @@ public class TermsLongFacetCollector extends AbstractFacetCollector {
|
||||||
private final SearchScript script;
|
private final SearchScript script;
|
||||||
|
|
||||||
public TermsLongFacetCollector(String facetName, String fieldName, int size, TermsFacet.ComparatorType comparatorType, boolean allTerms, SearchContext context,
|
public TermsLongFacetCollector(String facetName, String fieldName, int size, TermsFacet.ComparatorType comparatorType, boolean allTerms, SearchContext context,
|
||||||
String scriptLang, String script, Map<String, Object> params) {
|
ImmutableSet<String> excluded, String scriptLang, String script, Map<String, Object> params) {
|
||||||
super(facetName);
|
super(facetName);
|
||||||
this.fieldDataCache = context.fieldDataCache();
|
this.fieldDataCache = context.fieldDataCache();
|
||||||
this.size = size;
|
this.size = size;
|
||||||
|
@ -104,10 +107,10 @@ public class TermsLongFacetCollector extends AbstractFacetCollector {
|
||||||
this.script = null;
|
this.script = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.script == null) {
|
if (this.script == null && excluded.isEmpty()) {
|
||||||
aggregator = new StaticAggregatorValueProc(popFacets());
|
aggregator = new StaticAggregatorValueProc(popFacets());
|
||||||
} else {
|
} else {
|
||||||
aggregator = new AggregatorValueProc(popFacets(), this.script);
|
aggregator = new AggregatorValueProc(popFacets(), excluded, this.script);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allTerms) {
|
if (allTerms) {
|
||||||
|
@ -178,12 +181,25 @@ public class TermsLongFacetCollector extends AbstractFacetCollector {
|
||||||
|
|
||||||
private final SearchScript script;
|
private final SearchScript script;
|
||||||
|
|
||||||
public AggregatorValueProc(TLongIntHashMap facets, SearchScript script) {
|
private final TLongHashSet excluded;
|
||||||
|
|
||||||
|
public AggregatorValueProc(TLongIntHashMap facets, Set<String> excluded, SearchScript script) {
|
||||||
super(facets);
|
super(facets);
|
||||||
this.script = script;
|
this.script = script;
|
||||||
|
if (excluded == null || excluded.isEmpty()) {
|
||||||
|
this.excluded = null;
|
||||||
|
} else {
|
||||||
|
this.excluded = new TLongHashSet(excluded.size());
|
||||||
|
for (String s : excluded) {
|
||||||
|
this.excluded.add(Long.parseLong(s));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onValue(int docId, long value) {
|
@Override public void onValue(int docId, long value) {
|
||||||
|
if (excluded != null && excluded.contains(value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (script != null) {
|
if (script != null) {
|
||||||
script.setNextDocId(docId);
|
script.setNextDocId(docId);
|
||||||
script.setNextVar("term", value);
|
script.setNextVar("term", value);
|
||||||
|
|
|
@ -24,9 +24,11 @@ import org.apache.lucene.search.Scorer;
|
||||||
import org.elasticsearch.ElasticSearchIllegalArgumentException;
|
import org.elasticsearch.ElasticSearchIllegalArgumentException;
|
||||||
import org.elasticsearch.common.collect.BoundedTreeSet;
|
import org.elasticsearch.common.collect.BoundedTreeSet;
|
||||||
import org.elasticsearch.common.collect.ImmutableList;
|
import org.elasticsearch.common.collect.ImmutableList;
|
||||||
|
import org.elasticsearch.common.collect.ImmutableSet;
|
||||||
import org.elasticsearch.common.thread.ThreadLocals;
|
import org.elasticsearch.common.thread.ThreadLocals;
|
||||||
import org.elasticsearch.common.trove.iterator.TShortIntIterator;
|
import org.elasticsearch.common.trove.iterator.TShortIntIterator;
|
||||||
import org.elasticsearch.common.trove.map.hash.TShortIntHashMap;
|
import org.elasticsearch.common.trove.map.hash.TShortIntHashMap;
|
||||||
|
import org.elasticsearch.common.trove.set.hash.TShortHashSet;
|
||||||
import org.elasticsearch.index.cache.field.data.FieldDataCache;
|
import org.elasticsearch.index.cache.field.data.FieldDataCache;
|
||||||
import org.elasticsearch.index.field.data.FieldDataType;
|
import org.elasticsearch.index.field.data.FieldDataType;
|
||||||
import org.elasticsearch.index.field.data.shorts.ShortFieldData;
|
import org.elasticsearch.index.field.data.shorts.ShortFieldData;
|
||||||
|
@ -42,6 +44,7 @@ import java.io.IOException;
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
import java.util.Deque;
|
import java.util.Deque;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author kimchy (shay.banon)
|
* @author kimchy (shay.banon)
|
||||||
|
@ -73,7 +76,7 @@ public class TermsShortFacetCollector extends AbstractFacetCollector {
|
||||||
private final SearchScript script;
|
private final SearchScript script;
|
||||||
|
|
||||||
public TermsShortFacetCollector(String facetName, String fieldName, int size, TermsFacet.ComparatorType comparatorType, boolean allTerms, SearchContext context,
|
public TermsShortFacetCollector(String facetName, String fieldName, int size, TermsFacet.ComparatorType comparatorType, boolean allTerms, SearchContext context,
|
||||||
String scriptLang, String script, Map<String, Object> params) {
|
ImmutableSet<String> excluded, String scriptLang, String script, Map<String, Object> params) {
|
||||||
super(facetName);
|
super(facetName);
|
||||||
this.fieldDataCache = context.fieldDataCache();
|
this.fieldDataCache = context.fieldDataCache();
|
||||||
this.size = size;
|
this.size = size;
|
||||||
|
@ -103,10 +106,10 @@ public class TermsShortFacetCollector extends AbstractFacetCollector {
|
||||||
this.script = null;
|
this.script = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.script == null) {
|
if (this.script == null && excluded.isEmpty()) {
|
||||||
aggregator = new StaticAggregatorValueProc(popFacets());
|
aggregator = new StaticAggregatorValueProc(popFacets());
|
||||||
} else {
|
} else {
|
||||||
aggregator = new AggregatorValueProc(popFacets(), this.script);
|
aggregator = new AggregatorValueProc(popFacets(), excluded, this.script);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allTerms) {
|
if (allTerms) {
|
||||||
|
@ -177,12 +180,25 @@ public class TermsShortFacetCollector extends AbstractFacetCollector {
|
||||||
|
|
||||||
private final SearchScript script;
|
private final SearchScript script;
|
||||||
|
|
||||||
public AggregatorValueProc(TShortIntHashMap facets, SearchScript script) {
|
private final TShortHashSet excluded;
|
||||||
|
|
||||||
|
public AggregatorValueProc(TShortIntHashMap facets, Set<String> excluded, SearchScript script) {
|
||||||
super(facets);
|
super(facets);
|
||||||
|
if (excluded == null || excluded.isEmpty()) {
|
||||||
|
this.excluded = null;
|
||||||
|
} else {
|
||||||
|
this.excluded = new TShortHashSet(excluded.size());
|
||||||
|
for (String s : excluded) {
|
||||||
|
this.excluded.add(Short.parseShort(s));
|
||||||
|
}
|
||||||
|
}
|
||||||
this.script = script;
|
this.script = script;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void onValue(int docId, short value) {
|
@Override public void onValue(int docId, short value) {
|
||||||
|
if (excluded != null && excluded.contains(value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (script != null) {
|
if (script != null) {
|
||||||
script.setNextDocId(docId);
|
script.setNextDocId(docId);
|
||||||
script.setNextVar("term", value);
|
script.setNextVar("term", value);
|
||||||
|
|
|
@ -432,6 +432,7 @@ public class SimpleFacetsTests extends AbstractNodesTests {
|
||||||
.setQuery(termQuery("stag", "111"))
|
.setQuery(termQuery("stag", "111"))
|
||||||
.addFacet(termsFacet("facet1").field("lstag").size(10))
|
.addFacet(termsFacet("facet1").field("lstag").size(10))
|
||||||
.addFacet(termsFacet("facet2").field("ltag").size(10))
|
.addFacet(termsFacet("facet2").field("ltag").size(10))
|
||||||
|
.addFacet(termsFacet("facet3").field("ltag").size(10).exclude(3000))
|
||||||
.execute().actionGet();
|
.execute().actionGet();
|
||||||
|
|
||||||
facet = searchResponse.facets().facet("facet1");
|
facet = searchResponse.facets().facet("facet1");
|
||||||
|
@ -452,6 +453,15 @@ public class SimpleFacetsTests extends AbstractNodesTests {
|
||||||
assertThat(facet.entries().get(2).term(), anyOf(equalTo("1000"), equalTo("3000")));
|
assertThat(facet.entries().get(2).term(), anyOf(equalTo("1000"), equalTo("3000")));
|
||||||
assertThat(facet.entries().get(2).count(), equalTo(1));
|
assertThat(facet.entries().get(2).count(), equalTo(1));
|
||||||
|
|
||||||
|
facet = searchResponse.facets().facet("facet3");
|
||||||
|
assertThat(facet, instanceOf(InternalLongTermsFacet.class));
|
||||||
|
assertThat(facet.name(), equalTo("facet3"));
|
||||||
|
assertThat(facet.entries().size(), equalTo(2));
|
||||||
|
assertThat(facet.entries().get(0).term(), equalTo("2000"));
|
||||||
|
assertThat(facet.entries().get(0).count(), equalTo(2));
|
||||||
|
assertThat(facet.entries().get(1).term(), equalTo("1000"));
|
||||||
|
assertThat(facet.entries().get(1).count(), equalTo(1));
|
||||||
|
|
||||||
searchResponse = client.prepareSearch()
|
searchResponse = client.prepareSearch()
|
||||||
.setQuery(termQuery("stag", "111"))
|
.setQuery(termQuery("stag", "111"))
|
||||||
.addFacet(termsFacet("facet1").field("dstag").size(10))
|
.addFacet(termsFacet("facet1").field("dstag").size(10))
|
||||||
|
|
Loading…
Reference in New Issue