Skip to content

Commit feb7aee

Browse files
committed
Don't add to DenseVectorFieldMapper yet
1 parent 528bdba commit feb7aee

File tree

16 files changed

+47
-257
lines changed

16 files changed

+47
-257
lines changed

server/src/main/java/org/elasticsearch/index/mapper/BlockDocValuesReader.java

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.apache.lucene.util.BytesRef;
2323
import org.elasticsearch.common.io.stream.ByteArrayStreamInput;
2424
import org.elasticsearch.index.IndexVersion;
25-
import org.elasticsearch.index.codec.vectors.BFloat16;
2625
import org.elasticsearch.index.mapper.BlockLoader.BlockFactory;
2726
import org.elasticsearch.index.mapper.BlockLoader.BooleanBuilder;
2827
import org.elasticsearch.index.mapper.BlockLoader.Builder;
@@ -37,9 +36,6 @@
3736
import org.elasticsearch.search.fetch.StoredFieldsSpec;
3837

3938
import java.io.IOException;
40-
import java.nio.ByteBuffer;
41-
import java.nio.ByteOrder;
42-
import java.nio.ShortBuffer;
4339

4440
import static org.elasticsearch.index.mapper.vectors.DenseVectorFieldMapper.COSINE_MAGNITUDE_FIELD_SUFFIX;
4541

@@ -540,8 +536,7 @@ public Builder builder(BlockFactory factory, int expectedCount) {
540536
@Override
541537
public AllReader reader(LeafReaderContext context) throws IOException {
542538
switch (fieldType.getElementType()) {
543-
case FLOAT, BFLOAT16 -> {
544-
// BFloat16 is handled by the implementation of FloatVectorValues
539+
case FLOAT -> {
545540
FloatVectorValues floatVectorValues = context.reader().getFloatVectorValues(fieldName);
546541
if (floatVectorValues != null) {
547542
if (fieldType.isNormalized()) {
@@ -1057,7 +1052,6 @@ public AllReader reader(LeafReaderContext context) throws IOException {
10571052
}
10581053
return switch (elementType) {
10591054
case FLOAT -> new FloatDenseVectorFromBinary(docValues, dims, indexVersion);
1060-
case BFLOAT16 -> new BFloat16DenseVectorFromBinary(docValues, dims, indexVersion);
10611055
case BYTE -> new ByteDenseVectorFromBinary(docValues, dims, indexVersion);
10621056
case BIT -> new BitDenseVectorFromBinary(docValues, dims, indexVersion);
10631057
};
@@ -1141,26 +1135,6 @@ public String toString() {
11411135
}
11421136
}
11431137

1144-
private static class BFloat16DenseVectorFromBinary extends FloatDenseVectorFromBinary {
1145-
BFloat16DenseVectorFromBinary(BinaryDocValues docValues, int dims, IndexVersion indexVersion) {
1146-
super(docValues, dims, indexVersion);
1147-
}
1148-
1149-
@Override
1150-
protected void decodeDenseVector(BytesRef bytesRef, float[] scratch) {
1151-
VectorEncoderDecoder.decodeDenseVector(indexVersion, bytesRef, scratch);
1152-
ShortBuffer sb = ByteBuffer.wrap(bytesRef.bytes, bytesRef.offset, bytesRef.length)
1153-
.order(ByteOrder.LITTLE_ENDIAN)
1154-
.asShortBuffer();
1155-
BFloat16.bFloat16ToFloat(sb, scratch);
1156-
}
1157-
1158-
@Override
1159-
public String toString() {
1160-
return "BFloat16DenseVectorFromBinary.Bytes";
1161-
}
1162-
}
1163-
11641138
private static class ByteDenseVectorFromBinary extends AbstractDenseVectorFromBinary<byte[]> {
11651139
ByteDenseVectorFromBinary(BinaryDocValues docValues, int dims, IndexVersion indexVersion) {
11661140
this(docValues, dims, indexVersion, dims);

server/src/main/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapper.java

Lines changed: 13 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import org.elasticsearch.index.IndexSettings;
4848
import org.elasticsearch.index.IndexVersion;
4949
import org.elasticsearch.index.IndexVersions;
50-
import org.elasticsearch.index.codec.vectors.BFloat16;
5150
import org.elasticsearch.index.codec.vectors.ES813FlatVectorFormat;
5251
import org.elasticsearch.index.codec.vectors.ES813Int8FlatVectorFormat;
5352
import org.elasticsearch.index.codec.vectors.ES814HnswScalarQuantizedVectorsFormat;
@@ -461,7 +460,6 @@ public DenseVectorFieldMapper build(MapperBuilderContext context) {
461460
public enum ElementType {
462461
BYTE,
463462
FLOAT,
464-
BFLOAT16,
465463
BIT;
466464

467465
public static ElementType fromString(String name) {
@@ -476,16 +474,13 @@ public String toString() {
476474

477475
public static final Element BYTE_ELEMENT = new ByteElement();
478476
public static final Element FLOAT_ELEMENT = new FloatElement();
479-
public static final Element BFLOAT16_ELEMENT = new BFloat16Element();
480477
public static final Element BIT_ELEMENT = new BitElement();
481478

482479
public static final Map<String, ElementType> namesToElementType = Map.of(
483480
ElementType.BYTE.toString(),
484481
ElementType.BYTE,
485482
ElementType.FLOAT.toString(),
486483
ElementType.FLOAT,
487-
ElementType.BFLOAT16.toString(),
488-
ElementType.BFLOAT16,
489484
ElementType.BIT.toString(),
490485
ElementType.BIT
491486
);
@@ -495,7 +490,6 @@ public abstract static class Element {
495490
public static Element getElement(ElementType elementType) {
496491
return switch (elementType) {
497492
case FLOAT -> FLOAT_ELEMENT;
498-
case BFLOAT16 -> BFLOAT16_ELEMENT;
499493
case BYTE -> BYTE_ELEMENT;
500494
case BIT -> BIT_ELEMENT;
501495
};
@@ -1061,29 +1055,6 @@ static UnaryOperator<StringBuilder> errorElementsAppender(float[] vector) {
10611055
}
10621056
}
10631057

1064-
private static class BFloat16Element extends FloatElement {
1065-
1066-
@Override
1067-
public ElementType elementType() {
1068-
return ElementType.BFLOAT16;
1069-
}
1070-
1071-
@Override
1072-
public void writeValue(ByteBuffer byteBuffer, float value) {
1073-
byteBuffer.putShort(BFloat16.floatToBFloat16(value));
1074-
}
1075-
1076-
@Override
1077-
public void readAndWriteValue(ByteBuffer byteBuffer, XContentBuilder b) throws IOException {
1078-
b.value(BFloat16.bFloat16ToFloat(byteBuffer.getShort()));
1079-
}
1080-
1081-
@Override
1082-
public int getNumBytes(int dimensions) {
1083-
return dimensions * BFloat16.BYTES;
1084-
}
1085-
}
1086-
10871058
private static class BitElement extends ByteElement {
10881059

10891060
@Override
@@ -1151,7 +1122,7 @@ public enum VectorSimilarity {
11511122
@Override
11521123
float score(float similarity, ElementType elementType, int dim) {
11531124
return switch (elementType) {
1154-
case BYTE, FLOAT, BFLOAT16 -> 1f / (1f + similarity * similarity);
1125+
case BYTE, FLOAT -> 1f / (1f + similarity * similarity);
11551126
case BIT -> (dim - similarity) / dim;
11561127
};
11571128
}
@@ -1166,14 +1137,14 @@ public VectorSimilarityFunction vectorSimilarityFunction(IndexVersion indexVersi
11661137
float score(float similarity, ElementType elementType, int dim) {
11671138
assert elementType != ElementType.BIT;
11681139
return switch (elementType) {
1169-
case BYTE, FLOAT, BFLOAT16 -> (1 + similarity) / 2f;
1140+
case BYTE, FLOAT -> (1 + similarity) / 2f;
11701141
default -> throw new IllegalArgumentException("Unsupported element type [" + elementType + "]");
11711142
};
11721143
}
11731144

11741145
@Override
11751146
public VectorSimilarityFunction vectorSimilarityFunction(IndexVersion indexVersion, ElementType elementType) {
1176-
return indexVersion.onOrAfter(NORMALIZE_COSINE) && (elementType == ElementType.FLOAT || elementType == ElementType.BFLOAT16)
1147+
return indexVersion.onOrAfter(NORMALIZE_COSINE) && ElementType.FLOAT.equals(elementType)
11771148
? VectorSimilarityFunction.DOT_PRODUCT
11781149
: VectorSimilarityFunction.COSINE;
11791150
}
@@ -1183,7 +1154,7 @@ public VectorSimilarityFunction vectorSimilarityFunction(IndexVersion indexVersi
11831154
float score(float similarity, ElementType elementType, int dim) {
11841155
return switch (elementType) {
11851156
case BYTE -> 0.5f + similarity / (float) (dim * (1 << 15));
1186-
case FLOAT, BFLOAT16 -> (1 + similarity) / 2f;
1157+
case FLOAT -> (1 + similarity) / 2f;
11871158
default -> throw new IllegalArgumentException("Unsupported element type [" + elementType + "]");
11881159
};
11891160
}
@@ -1197,7 +1168,7 @@ public VectorSimilarityFunction vectorSimilarityFunction(IndexVersion indexVersi
11971168
@Override
11981169
float score(float similarity, ElementType elementType, int dim) {
11991170
return switch (elementType) {
1200-
case BYTE, FLOAT, BFLOAT16 -> similarity < 0 ? 1 / (1 + -1 * similarity) : similarity + 1;
1171+
case BYTE, FLOAT -> similarity < 0 ? 1 / (1 + -1 * similarity) : similarity + 1;
12011172
default -> throw new IllegalArgumentException("Unsupported element type [" + elementType + "]");
12021173
};
12031174
}
@@ -1503,7 +1474,7 @@ public DenseVectorIndexOptions parseIndexOptions(String fieldName, Map<String, ?
15031474

15041475
@Override
15051476
public boolean supportsElementType(ElementType elementType) {
1506-
return elementType == ElementType.FLOAT || elementType == ElementType.BFLOAT16;
1477+
return elementType == ElementType.FLOAT;
15071478
}
15081479

15091480
@Override
@@ -1527,7 +1498,7 @@ public DenseVectorIndexOptions parseIndexOptions(String fieldName, Map<String, ?
15271498

15281499
@Override
15291500
public boolean supportsElementType(ElementType elementType) {
1530-
return elementType == ElementType.FLOAT || elementType == ElementType.BFLOAT16;
1501+
return elementType == ElementType.FLOAT;
15311502
}
15321503

15331504
@Override
@@ -2067,10 +2038,8 @@ public BBQHnswIndexOptions(int m, int efConstruction, RescoreVector rescoreVecto
20672038

20682039
@Override
20692040
KnnVectorsFormat getVectorsFormat(ElementType elementType) {
2070-
return switch (elementType) {
2071-
case FLOAT -> new ES818HnswBinaryQuantizedVectorsFormat(m, efConstruction);
2072-
default -> throw new AssertionError();
2073-
};
2041+
assert elementType == ElementType.FLOAT;
2042+
return new ES818HnswBinaryQuantizedVectorsFormat(m, efConstruction);
20742043
}
20752044

20762045
@Override
@@ -2129,10 +2098,8 @@ static class BBQFlatIndexOptions extends QuantizedIndexOptions {
21292098

21302099
@Override
21312100
KnnVectorsFormat getVectorsFormat(ElementType elementType) {
2132-
return switch (elementType) {
2133-
case FLOAT -> new ES818BinaryQuantizedVectorsFormat();
2134-
default -> throw new AssertionError();
2135-
};
2101+
assert elementType == ElementType.FLOAT;
2102+
return new ES818BinaryQuantizedVectorsFormat();
21362103
}
21372104

21382105
@Override
@@ -2381,7 +2348,7 @@ public Query createExactKnnQuery(VectorData queryVector, Float vectorSimilarity)
23812348
}
23822349
Query knnQuery = switch (element.elementType()) {
23832350
case BYTE -> createExactKnnByteQuery(queryVector.asByteVector());
2384-
case FLOAT, BFLOAT16 -> createExactKnnFloatQuery(queryVector.asFloatVector());
2351+
case FLOAT -> createExactKnnFloatQuery(queryVector.asFloatVector());
23852352
case BIT -> createExactKnnBitQuery(queryVector.asByteVector());
23862353
};
23872354
if (vectorSimilarity != null) {
@@ -2462,7 +2429,7 @@ public Query createKnnQuery(
24622429
knnSearchStrategy,
24632430
hnswEarlyTermination
24642431
);
2465-
case FLOAT, BFLOAT16 -> createKnnFloatQuery(
2432+
case FLOAT -> createKnnFloatQuery(
24662433
queryVector.asFloatVector(),
24672434
k,
24682435
numCands,

server/src/main/java/org/elasticsearch/index/mapper/vectors/VectorDVLeafFieldData.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,14 @@ public DocValuesScriptFieldFactory getScriptFieldFactory(String name) {
6969
if (indexed) {
7070
return switch (elementType) {
7171
case BYTE -> new ByteKnnDenseVectorDocValuesField(reader.getByteVectorValues(field), name, dims);
72-
case FLOAT, BFLOAT16 -> new KnnDenseVectorDocValuesField(reader.getFloatVectorValues(field), name, dims);
72+
case FLOAT -> new KnnDenseVectorDocValuesField(reader.getFloatVectorValues(field), name, dims);
7373
case BIT -> new BitKnnDenseVectorDocValuesField(reader.getByteVectorValues(field), name, dims);
7474
};
7575
} else {
7676
BinaryDocValues values = DocValues.getBinary(reader, field);
7777
return switch (elementType) {
7878
case BYTE -> new ByteBinaryDenseVectorDocValuesField(values, name, elementType, dims);
79-
case FLOAT, BFLOAT16 -> new BinaryDenseVectorDocValuesField(values, name, elementType, dims, indexVersion);
79+
case FLOAT -> new BinaryDenseVectorDocValuesField(values, name, elementType, dims, indexVersion);
8080
case BIT -> new BitBinaryDenseVectorDocValuesField(values, name, elementType, dims);
8181
};
8282
}
@@ -138,7 +138,7 @@ public Object nextValue() {
138138
return vectorValue;
139139
}
140140
};
141-
case FLOAT, BFLOAT16 -> new FormattedDocValues() {
141+
case FLOAT -> new FormattedDocValues() {
142142
float[] vector = new float[dims];
143143
private FloatVectorValues floatVectorValues; // use when indexed
144144
private KnnVectorValues.DocIndexIterator iterator; // use when indexed

server/src/main/java/org/elasticsearch/script/VectorScoreScriptUtils.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ public L1Norm(ScoreScript scoreScript, Object queryVector, String fieldName) {
210210
}
211211
throw new IllegalArgumentException("Unsupported input object for byte vectors: " + queryVector.getClass().getName());
212212
}
213-
case FLOAT, BFLOAT16 -> {
213+
case FLOAT -> {
214214
if (queryVector instanceof List) {
215215
yield new FloatL1Norm(scoreScript, field, (List<Number>) queryVector);
216216
}
@@ -320,7 +320,7 @@ public L2Norm(ScoreScript scoreScript, Object queryVector, String fieldName) {
320320
}
321321
throw new IllegalArgumentException("Unsupported input object for byte vectors: " + queryVector.getClass().getName());
322322
}
323-
case FLOAT, BFLOAT16 -> {
323+
case FLOAT -> {
324324
if (queryVector instanceof List) {
325325
yield new FloatL2Norm(scoreScript, field, (List<Number>) queryVector);
326326
}
@@ -478,7 +478,7 @@ public DotProduct(ScoreScript scoreScript, Object queryVector, String fieldName)
478478
}
479479
throw new IllegalArgumentException("Unsupported input object for byte vectors: " + queryVector.getClass().getName());
480480
}
481-
case FLOAT, BFLOAT16 -> {
481+
case FLOAT -> {
482482
if (queryVector instanceof List) {
483483
yield new FloatDotProduct(scoreScript, field, (List<Number>) queryVector);
484484
}
@@ -547,7 +547,7 @@ public CosineSimilarity(ScoreScript scoreScript, Object queryVector, String fiel
547547
}
548548
throw new IllegalArgumentException("Unsupported input object for byte vectors: " + queryVector.getClass().getName());
549549
}
550-
case FLOAT, BFLOAT16 -> {
550+
case FLOAT -> {
551551
if (queryVector instanceof List) {
552552
yield new FloatCosineSimilarity(scoreScript, field, (List<Number>) queryVector);
553553
}

server/src/test/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapperTestUtils.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ private DenseVectorFieldMapperTestUtils() {}
2222

2323
public static List<SimilarityMeasure> getSupportedSimilarities(DenseVectorFieldMapper.ElementType elementType) {
2424
return switch (elementType) {
25-
case FLOAT, BFLOAT16, BYTE -> List.of(SimilarityMeasure.values());
25+
case FLOAT, BYTE -> List.of(SimilarityMeasure.values());
2626
case BIT -> List.of(SimilarityMeasure.L2_NORM);
2727
};
2828
}
2929

3030
public static int getEmbeddingLength(DenseVectorFieldMapper.ElementType elementType, int dimensions) {
3131
return switch (elementType) {
32-
case FLOAT, BFLOAT16, BYTE -> dimensions;
32+
case FLOAT, BYTE -> dimensions;
3333
case BIT -> {
3434
assert dimensions % Byte.SIZE == 0;
3535
yield dimensions / Byte.SIZE;
@@ -43,7 +43,7 @@ public static int randomCompatibleDimensions(DenseVectorFieldMapper.ElementType
4343
}
4444

4545
return switch (elementType) {
46-
case FLOAT, BFLOAT16, BYTE -> RandomNumbers.randomIntBetween(random(), 1, max);
46+
case FLOAT, BYTE -> RandomNumbers.randomIntBetween(random(), 1, max);
4747
case BIT -> {
4848
if (max < 8) {
4949
throw new IllegalArgumentException("max must be at least 8 for bit vectors");

server/src/test/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapperTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2448,7 +2448,7 @@ protected Object generateRandomInputValue(MappedFieldType ft) {
24482448
DenseVectorFieldType vectorFieldType = (DenseVectorFieldType) ft;
24492449
return switch (vectorFieldType.getElementType()) {
24502450
case BYTE -> randomByteArrayOfLength(vectorFieldType.getVectorDimensions());
2451-
case FLOAT, BFLOAT16 -> randomNormalizedVector(vectorFieldType.getVectorDimensions());
2451+
case FLOAT -> randomNormalizedVector(vectorFieldType.getVectorDimensions());
24522452
case BIT -> randomByteArrayOfLength(vectorFieldType.getVectorDimensions() / 8);
24532453
};
24542454
}
@@ -3043,7 +3043,7 @@ public SyntheticSourceExample example(int maxValues) throws IOException {
30433043
Object value = switch (elementType) {
30443044
case BYTE, BIT:
30453045
yield randomList(dims, dims, ESTestCase::randomByte);
3046-
case FLOAT, BFLOAT16:
3046+
case FLOAT:
30473047
yield randomList(dims, dims, ESTestCase::randomFloat);
30483048
};
30493049
return new SyntheticSourceExample(value, value, this::mapping);

server/src/test/java/org/elasticsearch/search/vectors/AbstractKnnVectorQueryBuilderTestCase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ protected void doAssertLuceneQuery(KnnVectorQueryBuilder queryBuilder, Query que
247247
approxFilterQuery,
248248
expectedStrategy
249249
);
250-
case FLOAT, BFLOAT16 -> new ESKnnFloatVectorQuery(
250+
case FLOAT -> new ESKnnFloatVectorQuery(
251251
VECTOR_FIELD,
252252
queryBuilder.queryVector().asFloatVector(),
253253
k,
@@ -268,7 +268,7 @@ protected void doAssertLuceneQuery(KnnVectorQueryBuilder queryBuilder, Query que
268268
yield new DenseVectorQuery.Bytes(queryBuilder.queryVector().asByteVector(), VECTOR_FIELD);
269269
}
270270
}
271-
case FLOAT, BFLOAT16 -> {
271+
case FLOAT -> {
272272
if (filterQuery != null) {
273273
yield new BooleanQuery.Builder().add(
274274
new DenseVectorQuery.Floats(queryBuilder.queryVector().asFloatVector(), VECTOR_FIELD),

x-pack/plugin/inference/qa/test-service-plugin/src/main/java/org/elasticsearch/xpack/inference/mock/TestDenseInferenceServiceExtension.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ private static List<Float> generateEmbedding(String input, int dimensions, Dense
255255
// Copied from DenseVectorFieldMapperTestUtils due to dependency restrictions
256256
private static int getEmbeddingLength(DenseVectorFieldMapper.ElementType elementType, int dimensions) {
257257
return switch (elementType) {
258-
case FLOAT, BYTE, BFLOAT16 -> dimensions;
258+
case FLOAT, BYTE -> dimensions;
259259
case BIT -> {
260260
assert dimensions % Byte.SIZE == 0;
261261
yield dimensions / Byte.SIZE;

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/sagemaker/schema/elastic/ElasticTextEmbeddingPayload.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public TextEmbeddingResults<?> responseBody(SageMakerModel model, InvokeEndpoint
9797
return switch (model.apiServiceSettings().elementType()) {
9898
case BIT -> TextEmbeddingBinary.PARSER.apply(p, null);
9999
case BYTE -> TextEmbeddingBytes.PARSER.apply(p, null);
100-
case FLOAT, BFLOAT16 -> TextEmbeddingFloat.PARSER.apply(p, null);
100+
case FLOAT -> TextEmbeddingFloat.PARSER.apply(p, null);
101101
};
102102
}
103103
}

x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/mapper/SemanticInferenceMetadataFieldsRecoveryTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ private static SemanticTextField randomSemanticText(
269269
) throws IOException {
270270
ChunkedInference results = switch (model.getTaskType()) {
271271
case TEXT_EMBEDDING -> switch (model.getServiceSettings().elementType()) {
272-
case FLOAT, BFLOAT16 -> randomChunkedInferenceEmbeddingFloat(model, inputs);
272+
case FLOAT -> randomChunkedInferenceEmbeddingFloat(model, inputs);
273273
case BYTE, BIT -> randomChunkedInferenceEmbeddingByte(model, inputs);
274274
};
275275
case SPARSE_EMBEDDING -> randomChunkedInferenceEmbeddingSparse(inputs, false);

0 commit comments

Comments
 (0)