indexedTerm to return bytes

part of the effort to reduce conversion from string to types
This commit is contained in:
Shay Banon 2012-12-18 10:58:03 -08:00
parent 1cb531f000
commit b9c5f0472c
24 changed files with 75 additions and 81 deletions

View File

@ -25,6 +25,7 @@ import org.apache.lucene.index.Term;
import org.apache.lucene.search.Filter; import org.apache.lucene.search.Filter;
import org.apache.lucene.search.MultiTermQuery; import org.apache.lucene.search.MultiTermQuery;
import org.apache.lucene.search.Query; import org.apache.lucene.search.Query;
import org.apache.lucene.util.BytesRef;
import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Nullable;
import org.elasticsearch.index.codec.postingsformat.PostingsFormatProvider; import org.elasticsearch.index.codec.postingsformat.PostingsFormatProvider;
import org.elasticsearch.index.field.data.FieldDataType; import org.elasticsearch.index.field.data.FieldDataType;
@ -106,6 +107,13 @@ public interface FieldMapper<T> {
public Term createIndexNameTerm(String value) { public Term createIndexNameTerm(String value) {
return new Term(indexName, value); return new Term(indexName, value);
} }
/**
* Creates a new index term based on the provided value.
*/
public Term createIndexNameTerm(BytesRef value) {
return new Term(indexName, value);
}
} }
Names names(); Names names();
@ -172,7 +180,7 @@ public interface FieldMapper<T> {
/** /**
* Returns the indexed value. * Returns the indexed value.
*/ */
String indexedValue(String value); BytesRef indexedValue(String value);
/** /**
* Should the field query {@link #fieldQuery(String, org.elasticsearch.index.query.QueryParseContext)} be used when detecting this * Should the field query {@link #fieldQuery(String, org.elasticsearch.index.query.QueryParseContext)} be used when detecting this
@ -185,6 +193,8 @@ public interface FieldMapper<T> {
*/ */
Query fieldQuery(String value, @Nullable QueryParseContext context); Query fieldQuery(String value, @Nullable QueryParseContext context);
Filter fieldFilter(String value, @Nullable QueryParseContext context);
Query fuzzyQuery(String value, String minSim, int prefixLength, int maxExpansions, boolean transpositions); Query fuzzyQuery(String value, String minSim, int prefixLength, int maxExpansions, boolean transpositions);
Query fuzzyQuery(String value, double minSim, int prefixLength, int maxExpansions, boolean transpositions); Query fuzzyQuery(String value, double minSim, int prefixLength, int maxExpansions, boolean transpositions);
@ -202,8 +212,6 @@ public interface FieldMapper<T> {
*/ */
Query queryStringTermQuery(Term term); Query queryStringTermQuery(Term term);
Filter fieldFilter(String value, @Nullable QueryParseContext context);
/** /**
* Constructs a range query based on the mapper. * Constructs a range query based on the mapper.
*/ */

View File

@ -28,6 +28,8 @@ import org.elasticsearch.common.bytes.HashedBytesArray;
public final class Uid { public final class Uid {
public static final char DELIMITER = '#'; public static final char DELIMITER = '#';
public static final byte DELIMITER_BYTE = 0x23;
public static final BytesRef DELIMITER_BYTES = new BytesRef(new byte[]{DELIMITER_BYTE});
private final String type; private final String type;
@ -98,6 +100,14 @@ public final class Uid {
return new Uid(uid.substring(0, delimiterIndex), uid.substring(delimiterIndex + 1)); return new Uid(uid.substring(0, delimiterIndex), uid.substring(delimiterIndex + 1));
} }
public static BytesRef createUidAsBytes(String type, String id) {
BytesRef ref = new BytesRef(type.length() + 1 + id.length());
ref.copyChars(type);
ref.copyBytes(DELIMITER_BYTES);
ref.copyChars(id);
return ref;
}
public static String createUid(String type, String id) { public static String createUid(String type, String id) {
return createUid(new StringBuilder(), type, id); return createUid(new StringBuilder(), type, id);
} }
@ -110,7 +120,7 @@ public final class Uid {
public static HashedBytesArray[] splitUidIntoTypeAndId(BytesRef uid) { public static HashedBytesArray[] splitUidIntoTypeAndId(BytesRef uid) {
int loc = -1; int loc = -1;
for (int i = uid.offset; i < uid.length; i++) { for (int i = uid.offset; i < uid.length; i++) {
if (uid.bytes[i] == 0x23) { // 0x23 is equal to '#' if (uid.bytes[i] == DELIMITER_BYTE) { // 0x23 is equal to '#'
loc = i; loc = i;
break; break;
} }
@ -123,7 +133,7 @@ public final class Uid {
byte[] type = new byte[loc - uid.offset]; byte[] type = new byte[loc - uid.offset];
System.arraycopy(uid.bytes, uid.offset, type, 0, type.length); System.arraycopy(uid.bytes, uid.offset, type, 0, type.length);
byte[] id = new byte[uid.length - type.length -1]; byte[] id = new byte[uid.length - type.length - 1];
System.arraycopy(uid.bytes, loc + 1, id, 0, id.length); System.arraycopy(uid.bytes, loc + 1, id, 0, id.length);
return new HashedBytesArray[]{new HashedBytesArray(type), new HashedBytesArray(id)}; return new HashedBytesArray[]{new HashedBytesArray(type), new HashedBytesArray(id)};
} }

View File

@ -421,8 +421,8 @@ public abstract class AbstractFieldMapper<T> implements FieldMapper<T>, Mapper {
} }
@Override @Override
public String indexedValue(String value) { public BytesRef indexedValue(String value) {
return value; return new BytesRef(value);
} }
@Override @Override
@ -494,16 +494,16 @@ public abstract class AbstractFieldMapper<T> implements FieldMapper<T>, Mapper {
public Query rangeQuery(String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper, @Nullable QueryParseContext context) { public Query rangeQuery(String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper, @Nullable QueryParseContext context) {
// LUCENE 4 UPGRADE: Perhaps indexedValue() should return a BytesRef? // LUCENE 4 UPGRADE: Perhaps indexedValue() should return a BytesRef?
return new TermRangeQuery(names.indexName(), return new TermRangeQuery(names.indexName(),
lowerTerm == null ? null : new BytesRef(indexedValue(lowerTerm)), lowerTerm == null ? null : indexedValue(lowerTerm),
upperTerm == null ? null : new BytesRef(indexedValue(upperTerm)), upperTerm == null ? null : indexedValue(upperTerm),
includeLower, includeUpper); includeLower, includeUpper);
} }
@Override @Override
public Filter rangeFilter(String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper, @Nullable QueryParseContext context) { public Filter rangeFilter(String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper, @Nullable QueryParseContext context) {
return new TermRangeFilter(names.indexName(), return new TermRangeFilter(names.indexName(),
lowerTerm == null ? null : new BytesRef(indexedValue(lowerTerm)), lowerTerm == null ? null : indexedValue(lowerTerm),
upperTerm == null ? null : new BytesRef(indexedValue(upperTerm)), upperTerm == null ? null : indexedValue(upperTerm),
includeLower, includeUpper); includeLower, includeUpper);
} }

View File

@ -156,11 +156,6 @@ public class BinaryFieldMapper extends AbstractFieldMapper<byte[]> {
return null; return null;
} }
@Override
public String indexedValue(String value) {
return value;
}
@Override @Override
protected Field parseCreateField(ParseContext context) throws IOException { protected Field parseCreateField(ParseContext context) throws IOException {
if (!stored()) { if (!stored()) {

View File

@ -22,6 +22,7 @@ package org.elasticsearch.index.mapper.core;
import org.apache.lucene.document.Field; import org.apache.lucene.document.Field;
import org.apache.lucene.document.FieldType; import org.apache.lucene.document.FieldType;
import org.apache.lucene.search.Filter; import org.apache.lucene.search.Filter;
import org.apache.lucene.util.BytesRef;
import org.elasticsearch.common.Booleans; import org.elasticsearch.common.Booleans;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.lucene.Lucene;
@ -60,6 +61,11 @@ public class BooleanFieldMapper extends AbstractFieldMapper<Boolean> {
public static final Boolean NULL_VALUE = null; public static final Boolean NULL_VALUE = null;
} }
public static class Values {
public final static BytesRef TRUE = new BytesRef("T");
public final static BytesRef FALSE = new BytesRef("F");
}
public static class Builder extends AbstractFieldMapper.Builder<Builder, BooleanFieldMapper> { public static class Builder extends AbstractFieldMapper.Builder<Builder, BooleanFieldMapper> {
private Boolean nullValue = Defaults.NULL_VALUE; private Boolean nullValue = Defaults.NULL_VALUE;
@ -169,17 +175,17 @@ public class BooleanFieldMapper extends AbstractFieldMapper<Boolean> {
} }
@Override @Override
public String indexedValue(String value) { public BytesRef indexedValue(String value) {
if (value == null || value.length() == 0) { if (value == null || value.length() == 0) {
return "F"; return Values.FALSE;
} }
if (value.length() == 1 && value.charAt(0) == 'F') { if (value.length() == 1 && value.charAt(0) == 'F') {
return "F"; return Values.FALSE;
} }
if (Booleans.parseBoolean(value, false)) { if (Booleans.parseBoolean(value, false)) {
return "T"; return Values.TRUE;
} }
return "F"; return Values.FALSE;
} }
@Override @Override

View File

@ -146,10 +146,10 @@ public class ByteFieldMapper extends NumberFieldMapper<Byte> {
} }
@Override @Override
public String indexedValue(String value) { public BytesRef indexedValue(String value) {
BytesRef bytesRef = new BytesRef(); BytesRef bytesRef = new BytesRef();
NumericUtils.intToPrefixCoded(Byte.parseByte(value), precisionStep(), bytesRef); NumericUtils.intToPrefixCoded(Byte.parseByte(value), precisionStep(), bytesRef);
return bytesRef.utf8ToString(); return bytesRef;
} }
@Override @Override

View File

@ -220,10 +220,10 @@ public class DateFieldMapper extends NumberFieldMapper<Long> {
} }
@Override @Override
public String indexedValue(String value) { public BytesRef indexedValue(String value) {
BytesRef bytesRef = new BytesRef(); BytesRef bytesRef = new BytesRef();
NumericUtils.longToPrefixCoded(dateTimeFormatter.parser().parseMillis(value), precisionStep(), bytesRef); NumericUtils.longToPrefixCoded(dateTimeFormatter.parser().parseMillis(value), precisionStep(), bytesRef);
return bytesRef.utf8ToString(); return bytesRef;
} }
@Override @Override

View File

@ -148,11 +148,11 @@ public class DoubleFieldMapper extends NumberFieldMapper<Double> {
} }
@Override @Override
public String indexedValue(String value) { public BytesRef indexedValue(String value) {
long longValue = NumericUtils.doubleToSortableLong(Double.parseDouble(value)); long longValue = NumericUtils.doubleToSortableLong(Double.parseDouble(value));
BytesRef bytesRef = new BytesRef(); BytesRef bytesRef = new BytesRef();
NumericUtils.longToPrefixCoded(longValue, precisionStep(), bytesRef); NumericUtils.longToPrefixCoded(longValue, precisionStep(), bytesRef);
return bytesRef.utf8ToString(); return bytesRef;
} }
@Override @Override

View File

@ -146,11 +146,11 @@ public class FloatFieldMapper extends NumberFieldMapper<Float> {
} }
@Override @Override
public String indexedValue(String value) { public BytesRef indexedValue(String value) {
int intValue = NumericUtils.floatToSortableInt(Float.parseFloat(value)); int intValue = NumericUtils.floatToSortableInt(Float.parseFloat(value));
BytesRef bytesRef = new BytesRef(); BytesRef bytesRef = new BytesRef();
NumericUtils.intToPrefixCoded(intValue, precisionStep(), bytesRef); NumericUtils.intToPrefixCoded(intValue, precisionStep(), bytesRef);
return bytesRef.utf8ToString(); return bytesRef;
} }
@Override @Override

View File

@ -148,10 +148,10 @@ public class IntegerFieldMapper extends NumberFieldMapper<Integer> {
} }
@Override @Override
public String indexedValue(String value) { public BytesRef indexedValue(String value) {
BytesRef bytesRef = new BytesRef(); BytesRef bytesRef = new BytesRef();
NumericUtils.intToPrefixCoded(Integer.parseInt(value), precisionStep(), bytesRef); NumericUtils.intToPrefixCoded(Integer.parseInt(value), precisionStep(), bytesRef);
return bytesRef.utf8ToString(); return bytesRef;
} }
@Override @Override

View File

@ -148,10 +148,10 @@ public class LongFieldMapper extends NumberFieldMapper<Long> {
} }
@Override @Override
public String indexedValue(String value) { public BytesRef indexedValue(String value) {
BytesRef bytesRef = new BytesRef(); BytesRef bytesRef = new BytesRef();
NumericUtils.longToPrefixCoded(Long.parseLong(value), precisionStep(), bytesRef); NumericUtils.longToPrefixCoded(Long.parseLong(value), precisionStep(), bytesRef);
return bytesRef.utf8ToString(); return bytesRef;
} }
@Override @Override

View File

@ -148,10 +148,10 @@ public class ShortFieldMapper extends NumberFieldMapper<Short> {
} }
@Override @Override
public String indexedValue(String value) { public BytesRef indexedValue(String value) {
BytesRef bytesRef = new BytesRef(); BytesRef bytesRef = new BytesRef();
NumericUtils.intToPrefixCoded(Short.parseShort(value), precisionStep(), bytesRef); NumericUtils.intToPrefixCoded(Short.parseShort(value), precisionStep(), bytesRef);
return bytesRef.utf8ToString(); return bytesRef;
} }
@Override @Override

View File

@ -229,11 +229,6 @@ public class StringFieldMapper extends AbstractFieldMapper<String> implements Al
return value; return value;
} }
@Override
public String indexedValue(String value) {
return value;
}
@Override @Override
protected boolean customBoost() { protected boolean customBoost() {
return true; return true;

View File

@ -145,11 +145,11 @@ public class BoostFieldMapper extends NumberFieldMapper<Float> implements Intern
} }
@Override @Override
public String indexedValue(String value) { public BytesRef indexedValue(String value) {
int intValue = NumericUtils.floatToSortableInt(Float.parseFloat(value)); int intValue = NumericUtils.floatToSortableInt(Float.parseFloat(value));
BytesRef bytesRef = new BytesRef(); BytesRef bytesRef = new BytesRef();
NumericUtils.intToPrefixCoded(intValue, precisionStep(), bytesRef); NumericUtils.intToPrefixCoded(intValue, precisionStep(), bytesRef);
return bytesRef.utf8ToString(); return bytesRef;
} }
@Override @Override

View File

@ -143,11 +143,6 @@ public class IdFieldMapper extends AbstractFieldMapper<String> implements Intern
return value; return value;
} }
@Override
public String indexedValue(String value) {
return value;
}
@Override @Override
public boolean useFieldQueryWithQueryString() { public boolean useFieldQueryWithQueryString() {
return true; return true;

View File

@ -137,11 +137,6 @@ public class IndexFieldMapper extends AbstractFieldMapper<String> implements Int
return value; return value;
} }
@Override
public String indexedValue(String value) {
return value;
}
public Term term(String value) { public Term term(String value) {
return names().createIndexNameTerm(value); return names().createIndexNameTerm(value);
} }

View File

@ -26,6 +26,7 @@ import org.apache.lucene.index.Term;
import org.apache.lucene.search.ConstantScoreQuery; import org.apache.lucene.search.ConstantScoreQuery;
import org.apache.lucene.search.Filter; import org.apache.lucene.search.Filter;
import org.apache.lucene.search.Query; import org.apache.lucene.search.Query;
import org.apache.lucene.util.BytesRef;
import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.lucene.Lucene;
@ -192,11 +193,11 @@ public class ParentFieldMapper extends AbstractFieldMapper<Uid> implements Inter
} }
@Override @Override
public String indexedValue(String value) { public BytesRef indexedValue(String value) {
if (value.indexOf(Uid.DELIMITER) == -1) { if (value.indexOf(Uid.DELIMITER) == -1) {
return Uid.createUid(type, value); return Uid.createUidAsBytes(type, value);
} }
return value; return super.indexedValue(value);
} }
@Override @Override

View File

@ -151,11 +151,6 @@ public class RoutingFieldMapper extends AbstractFieldMapper<String> implements I
return value; return value;
} }
@Override
public String indexedValue(String value) {
return value;
}
@Override @Override
public void validate(ParseContext context) throws MapperParsingException { public void validate(ParseContext context) throws MapperParsingException {
String routing = context.sourceToParse().routing(); String routing = context.sourceToParse().routing();

View File

@ -373,11 +373,6 @@ public class SourceFieldMapper extends AbstractFieldMapper<byte[]> implements In
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override
public String indexedValue(String value) {
return value;
}
@Override @Override
protected String contentType() { protected String contentType() {
return CONTENT_TYPE; return CONTENT_TYPE;

View File

@ -121,11 +121,6 @@ public class TypeFieldMapper extends AbstractFieldMapper<String> implements Inte
return value; return value;
} }
@Override
public String indexedValue(String value) {
return value;
}
public Term term(String value) { public Term term(String value) {
return names().createIndexNameTerm(value); return names().createIndexNameTerm(value);
} }

View File

@ -184,11 +184,6 @@ public class UidFieldMapper extends AbstractFieldMapper<Uid> implements Internal
return Uid.createUid(value); return Uid.createUid(value);
} }
@Override
public String indexedValue(String value) {
return value;
}
public Term term(String type, String id) { public Term term(String type, String id) {
return term(Uid.createUid(type, id)); return term(Uid.createUid(type, id));
} }

View File

@ -186,10 +186,10 @@ public class IpFieldMapper extends NumberFieldMapper<Long> {
} }
@Override @Override
public String indexedValue(String value) { public BytesRef indexedValue(String value) {
BytesRef bytesRef = new BytesRef(); BytesRef bytesRef = new BytesRef();
NumericUtils.longToPrefixCoded(ipToLong(value), precisionStep(), bytesRef); NumericUtils.longToPrefixCoded(ipToLong(value), precisionStep(), bytesRef);
return bytesRef.utf8ToString(); return bytesRef;
} }
@Override @Override

View File

@ -22,6 +22,7 @@ package org.elasticsearch.index.query;
import org.apache.lucene.index.Term; import org.apache.lucene.index.Term;
import org.apache.lucene.search.Query; import org.apache.lucene.search.Query;
import org.apache.lucene.search.spans.SpanTermQuery; import org.apache.lucene.search.spans.SpanTermQuery;
import org.apache.lucene.util.BytesRef;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
@ -90,15 +91,19 @@ public class SpanTermQueryParser implements QueryParser {
throw new QueryParsingException(parseContext.index(), "No value specified for term query"); throw new QueryParsingException(parseContext.index(), "No value specified for term query");
} }
BytesRef valueBytes = null;
MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName); MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName);
if (smartNameFieldMappers != null) { if (smartNameFieldMappers != null) {
if (smartNameFieldMappers.hasMapper()) { if (smartNameFieldMappers.hasMapper()) {
fieldName = smartNameFieldMappers.mapper().names().indexName(); fieldName = smartNameFieldMappers.mapper().names().indexName();
value = smartNameFieldMappers.mapper().indexedValue(value); valueBytes = smartNameFieldMappers.mapper().indexedValue(value);
} }
} }
if (valueBytes == null) {
valueBytes = new BytesRef(value);
}
SpanTermQuery query = new SpanTermQuery(new Term(fieldName, value)); SpanTermQuery query = new SpanTermQuery(new Term(fieldName, valueBytes));
query.setBoost(boost); query.setBoost(boost);
return wrapSmartNameQuery(query, smartNameFieldMappers, parseContext); return wrapSmartNameQuery(query, smartNameFieldMappers, parseContext);
} }

View File

@ -22,6 +22,7 @@ package org.elasticsearch.index.query;
import org.apache.lucene.index.Term; import org.apache.lucene.index.Term;
import org.apache.lucene.search.Query; import org.apache.lucene.search.Query;
import org.apache.lucene.search.WildcardQuery; import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.util.BytesRef;
import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.mapper.MapperService;
@ -90,13 +91,16 @@ public class WildcardQueryParser implements QueryParser {
throw new QueryParsingException(parseContext.index(), "No value specified for prefix query"); throw new QueryParsingException(parseContext.index(), "No value specified for prefix query");
} }
BytesRef valueBytes;
MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName); MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName);
if (smartNameFieldMappers != null && smartNameFieldMappers.hasMapper()) { if (smartNameFieldMappers != null && smartNameFieldMappers.hasMapper()) {
fieldName = smartNameFieldMappers.mapper().names().indexName(); fieldName = smartNameFieldMappers.mapper().names().indexName();
value = smartNameFieldMappers.mapper().indexedValue(value); valueBytes = smartNameFieldMappers.mapper().indexedValue(value);
} else {
valueBytes = new BytesRef(value);
} }
WildcardQuery query = new WildcardQuery(new Term(fieldName, value)); WildcardQuery query = new WildcardQuery(new Term(fieldName, valueBytes));
QueryParsers.setRewriteMethod(query, rewriteMethod); QueryParsers.setRewriteMethod(query, rewriteMethod);
query.setRewriteMethod(QueryParsers.parseRewriteMethod(rewriteMethod)); query.setRewriteMethod(QueryParsers.parseRewriteMethod(rewriteMethod));
query.setBoost(boost); query.setBoost(boost);