Support date and ip types for numeric_range filter, closes #530.

This commit is contained in:
kimchy 2010-11-22 16:17:51 +02:00
parent b4113d57d3
commit db1f7e09f3
11 changed files with 85 additions and 25 deletions

3
.idea/misc.xml generated
View File

@ -3,6 +3,9 @@
<component name="DependencyValidationManager">
<option name="SKIP_IMPORT_STATEMENTS" value="false" />
</component>
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="IdProvider" IDEtalkID="4A8F53B851E388D477AEE98A9276B454" />
<component name="JavadocGenerationManager">
<option name="OUTPUT_DIRECTORY" value="$USER_HOME$/tmp/tmp1" />

View File

@ -31,8 +31,10 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericFloatAnalyzer;
import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MergeMappingException;
import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
@ -127,6 +129,13 @@ public class BoostFieldMapper extends NumberFieldMapper<Float> implements org.el
includeLower, includeUpper);
}
@Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
return NumericRangeFieldDataFilter.newFloatRange(fieldDataCache, names.indexName(),
lowerTerm == null ? null : Float.parseFloat(lowerTerm),
upperTerm == null ? null : Float.parseFloat(upperTerm),
includeLower, includeUpper);
}
@Override public void parse(ParseContext context) throws IOException {
// we override parse since we want to handle cases where it is not indexed and not stored (the default)
float value = parseFloatValue(context);

View File

@ -34,9 +34,11 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericDateAnalyzer;
import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.util.Map;
@ -167,6 +169,13 @@ public class DateFieldMapper extends NumberFieldMapper<Long> {
includeLower, includeUpper);
}
@Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
return NumericRangeFieldDataFilter.newLongRange(fieldDataCache, names.indexName(),
lowerTerm == null ? null : parseStringValue(lowerTerm),
upperTerm == null ? null : parseStringValue(upperTerm),
includeLower, includeUpper);
}
@Override protected Field parseCreateField(ParseContext context) throws IOException {
String dateAsString;
if (context.externalValueSet()) {

View File

@ -31,9 +31,11 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericDoubleAnalyzer;
import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.util.Map;
@ -140,6 +142,13 @@ public class DoubleFieldMapper extends NumberFieldMapper<Double> {
includeLower, includeUpper);
}
@Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
return NumericRangeFieldDataFilter.newDoubleRange(fieldDataCache, names.indexName(),
lowerTerm == null ? null : Double.parseDouble(lowerTerm),
upperTerm == null ? null : Double.parseDouble(upperTerm),
includeLower, includeUpper);
}
@Override protected Field parseCreateField(ParseContext context) throws IOException {
double value;
if (context.externalValueSet()) {

View File

@ -32,9 +32,11 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericFloatAnalyzer;
import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.util.Map;
@ -139,6 +141,13 @@ public class FloatFieldMapper extends NumberFieldMapper<Float> {
includeLower, includeUpper);
}
@Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
return NumericRangeFieldDataFilter.newFloatRange(fieldDataCache, names.indexName(),
lowerTerm == null ? null : Float.parseFloat(lowerTerm),
upperTerm == null ? null : Float.parseFloat(upperTerm),
includeLower, includeUpper);
}
@Override protected Field parseCreateField(ParseContext context) throws IOException {
float value;
if (context.externalValueSet()) {

View File

@ -32,9 +32,11 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericIntegerAnalyzer;
import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.util.Map;
@ -139,6 +141,13 @@ public class IntegerFieldMapper extends NumberFieldMapper<Integer> {
includeLower, includeUpper);
}
@Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
return NumericRangeFieldDataFilter.newIntRange(fieldDataCache, names.indexName(),
lowerTerm == null ? null : Integer.parseInt(lowerTerm),
upperTerm == null ? null : Integer.parseInt(upperTerm),
includeLower, includeUpper);
}
@Override protected Field parseCreateField(ParseContext context) throws IOException {
int value;
if (context.externalValueSet()) {

View File

@ -32,9 +32,11 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericLongAnalyzer;
import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.util.Map;
@ -139,6 +141,13 @@ public class LongFieldMapper extends NumberFieldMapper<Long> {
includeLower, includeUpper);
}
@Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
return NumericRangeFieldDataFilter.newLongRange(fieldDataCache, names.indexName(),
lowerTerm == null ? null : Long.parseLong(lowerTerm),
upperTerm == null ? null : Long.parseLong(upperTerm),
includeLower, includeUpper);
}
@Override protected Field parseCreateField(ParseContext context) throws IOException {
long value;
if (context.externalValueSet()) {

View File

@ -29,6 +29,7 @@ import org.apache.lucene.util.NumericUtils;
import org.elasticsearch.common.thread.ThreadLocals;
import org.elasticsearch.common.trove.TIntObjectHashMap;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MergeMappingException;
@ -142,6 +143,11 @@ public abstract class NumberFieldMapper<T extends Number> extends AbstractFieldM
@Override public abstract Filter rangeFilter(String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper);
/**
* A range filter based on the field data cache.
*/
public abstract Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper);
/**
* Override the default behavior (to return the string, and return the actual Number instance).
*/

View File

@ -32,9 +32,11 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericIntegerAnalyzer;
import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.util.Map;
@ -139,6 +141,13 @@ public class ShortFieldMapper extends NumberFieldMapper<Short> {
includeLower, includeUpper);
}
@Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
return NumericRangeFieldDataFilter.newShortRange(fieldDataCache, names.indexName(),
lowerTerm == null ? null : Short.parseShort(lowerTerm),
upperTerm == null ? null : Short.parseShort(upperTerm),
includeLower, includeUpper);
}
@Override protected Field parseCreateField(ParseContext context) throws IOException {
short value;
if (context.externalValueSet()) {

View File

@ -35,6 +35,7 @@ import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericAnalyzer;
import org.elasticsearch.index.analysis.NumericTokenizer;
import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
@ -42,6 +43,7 @@ import org.elasticsearch.index.mapper.xcontent.MergeContext;
import org.elasticsearch.index.mapper.xcontent.NumberFieldMapper;
import org.elasticsearch.index.mapper.xcontent.ParseContext;
import org.elasticsearch.index.mapper.xcontent.XContentMapper;
import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.io.Reader;
@ -186,6 +188,13 @@ public class IpFieldMapper extends NumberFieldMapper<Long> {
includeLower, includeUpper);
}
@Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
return NumericRangeFieldDataFilter.newLongRange(fieldDataCache, names.indexName(),
lowerTerm == null ? null : ipToLong(lowerTerm),
upperTerm == null ? null : ipToLong(upperTerm),
includeLower, includeUpper);
}
@Override protected Field parseCreateField(ParseContext context) throws IOException {
String ipAsString;
if (context.externalValueSet()) {

View File

@ -25,11 +25,10 @@ import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.AbstractIndexComponent;
import org.elasticsearch.index.Index;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.FieldMapper;
import org.elasticsearch.index.mapper.MapperService;
import org.elasticsearch.index.mapper.xcontent.NumberFieldMapper;
import org.elasticsearch.index.query.QueryParsingException;
import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import org.elasticsearch.index.settings.IndexSettings;
import java.io.IOException;
@ -105,7 +104,6 @@ public class NumericRangeFilterParser extends AbstractIndexComponent implements
}
}
Filter filter;
MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName);
if (smartNameFieldMappers == null || !smartNameFieldMappers.hasMapper()) {
@ -113,29 +111,10 @@ public class NumericRangeFilterParser extends AbstractIndexComponent implements
}
FieldMapper mapper = smartNameFieldMappers.mapper();
if (mapper.fieldDataType() == FieldDataType.DefaultTypes.INT) {
filter = NumericRangeFieldDataFilter.newIntRange(parseContext.indexCache().fieldData(), mapper.names().indexName(),
from == null ? null : Integer.parseInt(from),
to == null ? null : Integer.parseInt(to),
includeLower, includeUpper);
} else if (mapper.fieldDataType() == FieldDataType.DefaultTypes.LONG) {
filter = NumericRangeFieldDataFilter.newLongRange(parseContext.indexCache().fieldData(), mapper.names().indexName(),
from == null ? null : Long.parseLong(from),
to == null ? null : Long.parseLong(to),
includeLower, includeUpper);
} else if (mapper.fieldDataType() == FieldDataType.DefaultTypes.FLOAT) {
filter = NumericRangeFieldDataFilter.newFloatRange(parseContext.indexCache().fieldData(), mapper.names().indexName(),
from == null ? null : Float.parseFloat(from),
to == null ? null : Float.parseFloat(to),
includeLower, includeUpper);
} else if (mapper.fieldDataType() == FieldDataType.DefaultTypes.DOUBLE) {
filter = NumericRangeFieldDataFilter.newDoubleRange(parseContext.indexCache().fieldData(), mapper.names().indexName(),
from == null ? null : Double.parseDouble(from),
to == null ? null : Double.parseDouble(to),
includeLower, includeUpper);
} else {
throw new QueryParsingException(index, "field [" + fieldName + "] is not numeric");
if (!(mapper instanceof NumberFieldMapper)) {
throw new QueryParsingException(index, "Field [" + fieldName + "] is not a numeric type");
}
Filter filter = ((NumberFieldMapper) mapper).rangeFilter(parseContext.indexCache().fieldData(), from, to, includeLower, includeUpper);
if (cache) {
filter = parseContext.cacheFilter(filter);