indexedTerm to return bytes
part of the effort to reduce conversion from string to types
This commit is contained in:
parent
1cb531f000
commit
b9c5f0472c
|
@ -25,6 +25,7 @@ import org.apache.lucene.index.Term;
|
|||
import org.apache.lucene.search.Filter;
|
||||
import org.apache.lucene.search.MultiTermQuery;
|
||||
import org.apache.lucene.search.Query;
|
||||
import org.apache.lucene.util.BytesRef;
|
||||
import org.elasticsearch.common.Nullable;
|
||||
import org.elasticsearch.index.codec.postingsformat.PostingsFormatProvider;
|
||||
import org.elasticsearch.index.field.data.FieldDataType;
|
||||
|
@ -106,6 +107,13 @@ public interface FieldMapper<T> {
|
|||
public Term createIndexNameTerm(String 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();
|
||||
|
@ -172,7 +180,7 @@ public interface FieldMapper<T> {
|
|||
/**
|
||||
* 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
|
||||
|
@ -185,6 +193,8 @@ public interface FieldMapper<T> {
|
|||
*/
|
||||
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, double minSim, int prefixLength, int maxExpansions, boolean transpositions);
|
||||
|
@ -202,8 +212,6 @@ public interface FieldMapper<T> {
|
|||
*/
|
||||
Query queryStringTermQuery(Term term);
|
||||
|
||||
Filter fieldFilter(String value, @Nullable QueryParseContext context);
|
||||
|
||||
/**
|
||||
* Constructs a range query based on the mapper.
|
||||
*/
|
||||
|
|
|
@ -28,6 +28,8 @@ import org.elasticsearch.common.bytes.HashedBytesArray;
|
|||
public final class Uid {
|
||||
|
||||
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;
|
||||
|
||||
|
@ -98,6 +100,14 @@ public final class Uid {
|
|||
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) {
|
||||
return createUid(new StringBuilder(), type, id);
|
||||
}
|
||||
|
@ -110,7 +120,7 @@ public final class Uid {
|
|||
public static HashedBytesArray[] splitUidIntoTypeAndId(BytesRef uid) {
|
||||
int loc = -1;
|
||||
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;
|
||||
break;
|
||||
}
|
||||
|
@ -123,7 +133,7 @@ public final class Uid {
|
|||
byte[] type = new byte[loc - uid.offset];
|
||||
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);
|
||||
return new HashedBytesArray[]{new HashedBytesArray(type), new HashedBytesArray(id)};
|
||||
}
|
||||
|
|
|
@ -421,8 +421,8 @@ public abstract class AbstractFieldMapper<T> implements FieldMapper<T>, Mapper {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
return value;
|
||||
public BytesRef indexedValue(String value) {
|
||||
return new BytesRef(value);
|
||||
}
|
||||
|
||||
@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) {
|
||||
// LUCENE 4 UPGRADE: Perhaps indexedValue() should return a BytesRef?
|
||||
return new TermRangeQuery(names.indexName(),
|
||||
lowerTerm == null ? null : new BytesRef(indexedValue(lowerTerm)),
|
||||
upperTerm == null ? null : new BytesRef(indexedValue(upperTerm)),
|
||||
lowerTerm == null ? null : indexedValue(lowerTerm),
|
||||
upperTerm == null ? null : indexedValue(upperTerm),
|
||||
includeLower, includeUpper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Filter rangeFilter(String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper, @Nullable QueryParseContext context) {
|
||||
return new TermRangeFilter(names.indexName(),
|
||||
lowerTerm == null ? null : new BytesRef(indexedValue(lowerTerm)),
|
||||
upperTerm == null ? null : new BytesRef(indexedValue(upperTerm)),
|
||||
lowerTerm == null ? null : indexedValue(lowerTerm),
|
||||
upperTerm == null ? null : indexedValue(upperTerm),
|
||||
includeLower, includeUpper);
|
||||
}
|
||||
|
||||
|
|
|
@ -156,11 +156,6 @@ public class BinaryFieldMapper extends AbstractFieldMapper<byte[]> {
|
|||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Field parseCreateField(ParseContext context) throws IOException {
|
||||
if (!stored()) {
|
||||
|
|
|
@ -22,6 +22,7 @@ package org.elasticsearch.index.mapper.core;
|
|||
import org.apache.lucene.document.Field;
|
||||
import org.apache.lucene.document.FieldType;
|
||||
import org.apache.lucene.search.Filter;
|
||||
import org.apache.lucene.util.BytesRef;
|
||||
import org.elasticsearch.common.Booleans;
|
||||
import org.elasticsearch.common.Strings;
|
||||
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 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> {
|
||||
|
||||
private Boolean nullValue = Defaults.NULL_VALUE;
|
||||
|
@ -169,17 +175,17 @@ public class BooleanFieldMapper extends AbstractFieldMapper<Boolean> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
public BytesRef indexedValue(String value) {
|
||||
if (value == null || value.length() == 0) {
|
||||
return "F";
|
||||
return Values.FALSE;
|
||||
}
|
||||
if (value.length() == 1 && value.charAt(0) == 'F') {
|
||||
return "F";
|
||||
return Values.FALSE;
|
||||
}
|
||||
if (Booleans.parseBoolean(value, false)) {
|
||||
return "T";
|
||||
return Values.TRUE;
|
||||
}
|
||||
return "F";
|
||||
return Values.FALSE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -146,10 +146,10 @@ public class ByteFieldMapper extends NumberFieldMapper<Byte> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
public BytesRef indexedValue(String value) {
|
||||
BytesRef bytesRef = new BytesRef();
|
||||
NumericUtils.intToPrefixCoded(Byte.parseByte(value), precisionStep(), bytesRef);
|
||||
return bytesRef.utf8ToString();
|
||||
return bytesRef;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -220,10 +220,10 @@ public class DateFieldMapper extends NumberFieldMapper<Long> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
public BytesRef indexedValue(String value) {
|
||||
BytesRef bytesRef = new BytesRef();
|
||||
NumericUtils.longToPrefixCoded(dateTimeFormatter.parser().parseMillis(value), precisionStep(), bytesRef);
|
||||
return bytesRef.utf8ToString();
|
||||
return bytesRef;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -148,11 +148,11 @@ public class DoubleFieldMapper extends NumberFieldMapper<Double> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
public BytesRef indexedValue(String value) {
|
||||
long longValue = NumericUtils.doubleToSortableLong(Double.parseDouble(value));
|
||||
BytesRef bytesRef = new BytesRef();
|
||||
NumericUtils.longToPrefixCoded(longValue, precisionStep(), bytesRef);
|
||||
return bytesRef.utf8ToString();
|
||||
return bytesRef;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -146,11 +146,11 @@ public class FloatFieldMapper extends NumberFieldMapper<Float> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
public BytesRef indexedValue(String value) {
|
||||
int intValue = NumericUtils.floatToSortableInt(Float.parseFloat(value));
|
||||
BytesRef bytesRef = new BytesRef();
|
||||
NumericUtils.intToPrefixCoded(intValue, precisionStep(), bytesRef);
|
||||
return bytesRef.utf8ToString();
|
||||
return bytesRef;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -148,10 +148,10 @@ public class IntegerFieldMapper extends NumberFieldMapper<Integer> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
public BytesRef indexedValue(String value) {
|
||||
BytesRef bytesRef = new BytesRef();
|
||||
NumericUtils.intToPrefixCoded(Integer.parseInt(value), precisionStep(), bytesRef);
|
||||
return bytesRef.utf8ToString();
|
||||
return bytesRef;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -148,10 +148,10 @@ public class LongFieldMapper extends NumberFieldMapper<Long> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
public BytesRef indexedValue(String value) {
|
||||
BytesRef bytesRef = new BytesRef();
|
||||
NumericUtils.longToPrefixCoded(Long.parseLong(value), precisionStep(), bytesRef);
|
||||
return bytesRef.utf8ToString();
|
||||
return bytesRef;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -148,10 +148,10 @@ public class ShortFieldMapper extends NumberFieldMapper<Short> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
public BytesRef indexedValue(String value) {
|
||||
BytesRef bytesRef = new BytesRef();
|
||||
NumericUtils.intToPrefixCoded(Short.parseShort(value), precisionStep(), bytesRef);
|
||||
return bytesRef.utf8ToString();
|
||||
return bytesRef;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -229,11 +229,6 @@ public class StringFieldMapper extends AbstractFieldMapper<String> implements Al
|
|||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean customBoost() {
|
||||
return true;
|
||||
|
|
|
@ -145,11 +145,11 @@ public class BoostFieldMapper extends NumberFieldMapper<Float> implements Intern
|
|||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
public BytesRef indexedValue(String value) {
|
||||
int intValue = NumericUtils.floatToSortableInt(Float.parseFloat(value));
|
||||
BytesRef bytesRef = new BytesRef();
|
||||
NumericUtils.intToPrefixCoded(intValue, precisionStep(), bytesRef);
|
||||
return bytesRef.utf8ToString();
|
||||
return bytesRef;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -143,11 +143,6 @@ public class IdFieldMapper extends AbstractFieldMapper<String> implements Intern
|
|||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useFieldQueryWithQueryString() {
|
||||
return true;
|
||||
|
|
|
@ -137,11 +137,6 @@ public class IndexFieldMapper extends AbstractFieldMapper<String> implements Int
|
|||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
return value;
|
||||
}
|
||||
|
||||
public Term term(String value) {
|
||||
return names().createIndexNameTerm(value);
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ import org.apache.lucene.index.Term;
|
|||
import org.apache.lucene.search.ConstantScoreQuery;
|
||||
import org.apache.lucene.search.Filter;
|
||||
import org.apache.lucene.search.Query;
|
||||
import org.apache.lucene.util.BytesRef;
|
||||
import org.elasticsearch.common.Nullable;
|
||||
import org.elasticsearch.common.Strings;
|
||||
import org.elasticsearch.common.lucene.Lucene;
|
||||
|
@ -192,11 +193,11 @@ public class ParentFieldMapper extends AbstractFieldMapper<Uid> implements Inter
|
|||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
public BytesRef indexedValue(String value) {
|
||||
if (value.indexOf(Uid.DELIMITER) == -1) {
|
||||
return Uid.createUid(type, value);
|
||||
return Uid.createUidAsBytes(type, value);
|
||||
}
|
||||
return value;
|
||||
return super.indexedValue(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -151,11 +151,6 @@ public class RoutingFieldMapper extends AbstractFieldMapper<String> implements I
|
|||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validate(ParseContext context) throws MapperParsingException {
|
||||
String routing = context.sourceToParse().routing();
|
||||
|
|
|
@ -373,11 +373,6 @@ public class SourceFieldMapper extends AbstractFieldMapper<byte[]> implements In
|
|||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String contentType() {
|
||||
return CONTENT_TYPE;
|
||||
|
|
|
@ -121,11 +121,6 @@ public class TypeFieldMapper extends AbstractFieldMapper<String> implements Inte
|
|||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
return value;
|
||||
}
|
||||
|
||||
public Term term(String value) {
|
||||
return names().createIndexNameTerm(value);
|
||||
}
|
||||
|
|
|
@ -184,11 +184,6 @@ public class UidFieldMapper extends AbstractFieldMapper<Uid> implements Internal
|
|||
return Uid.createUid(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
return value;
|
||||
}
|
||||
|
||||
public Term term(String type, String id) {
|
||||
return term(Uid.createUid(type, id));
|
||||
}
|
||||
|
|
|
@ -186,10 +186,10 @@ public class IpFieldMapper extends NumberFieldMapper<Long> {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String indexedValue(String value) {
|
||||
public BytesRef indexedValue(String value) {
|
||||
BytesRef bytesRef = new BytesRef();
|
||||
NumericUtils.longToPrefixCoded(ipToLong(value), precisionStep(), bytesRef);
|
||||
return bytesRef.utf8ToString();
|
||||
return bytesRef;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -22,6 +22,7 @@ package org.elasticsearch.index.query;
|
|||
import org.apache.lucene.index.Term;
|
||||
import org.apache.lucene.search.Query;
|
||||
import org.apache.lucene.search.spans.SpanTermQuery;
|
||||
import org.apache.lucene.util.BytesRef;
|
||||
import org.elasticsearch.common.Strings;
|
||||
import org.elasticsearch.common.inject.Inject;
|
||||
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");
|
||||
}
|
||||
|
||||
BytesRef valueBytes = null;
|
||||
MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName);
|
||||
if (smartNameFieldMappers != null) {
|
||||
if (smartNameFieldMappers.hasMapper()) {
|
||||
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);
|
||||
return wrapSmartNameQuery(query, smartNameFieldMappers, parseContext);
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ package org.elasticsearch.index.query;
|
|||
import org.apache.lucene.index.Term;
|
||||
import org.apache.lucene.search.Query;
|
||||
import org.apache.lucene.search.WildcardQuery;
|
||||
import org.apache.lucene.util.BytesRef;
|
||||
import org.elasticsearch.common.inject.Inject;
|
||||
import org.elasticsearch.common.xcontent.XContentParser;
|
||||
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");
|
||||
}
|
||||
|
||||
BytesRef valueBytes;
|
||||
MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName);
|
||||
if (smartNameFieldMappers != null && smartNameFieldMappers.hasMapper()) {
|
||||
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);
|
||||
query.setRewriteMethod(QueryParsers.parseRewriteMethod(rewriteMethod));
|
||||
query.setBoost(boost);
|
||||
|
|
Loading…
Reference in New Issue