Skip to content

Commit e2c2730

Browse files
committed
Base64 support
1 parent 1e905de commit e2c2730

File tree

4 files changed

+11
-8
lines changed

4 files changed

+11
-8
lines changed

server/src/main/java/org/elasticsearch/index/codec/vectors/BFloat16.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
import org.apache.lucene.util.BitUtil;
1313

14-
import java.nio.ByteOrder;
1514
import java.nio.ShortBuffer;
1615

1716
public final class BFloat16 {
@@ -38,7 +37,6 @@ public static float bFloat16ToFloat(short bf) {
3837
}
3938

4039
public static void floatToBFloat16(float[] floats, ShortBuffer bFloats) {
41-
assert bFloats.order() == ByteOrder.LITTLE_ENDIAN;
4240
for (float v : floats) {
4341
bFloats.put(floatToBFloat16(v));
4442
}
@@ -52,7 +50,6 @@ public static void bFloat16ToFloat(byte[] bfBytes, float[] floats) {
5250
}
5351

5452
public static void bFloat16ToFloat(ShortBuffer bFloats, float[] floats) {
55-
assert bFloats.order() == ByteOrder.LITTLE_ENDIAN;
5653
for (int i = 0; i < floats.length; i++) {
5754
floats[i] = bFloat16ToFloat(bFloats.get());
5855
}

server/src/main/java/org/elasticsearch/index/mapper/blockloader/docvalues/DenseVectorBlockLoader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public Builder builder(BlockFactory factory, int expectedCount) {
5353
@Override
5454
public AllReader reader(LeafReaderContext context) throws IOException {
5555
switch (fieldType.getElementType()) {
56-
case FLOAT -> {
56+
case FLOAT, BFLOAT16 -> {
5757
FloatVectorValues floatVectorValues = context.reader().getFloatVectorValues(fieldName);
5858
if (floatVectorValues != null) {
5959
if (fieldType.isNormalized()) {

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,20 +1150,26 @@ VectorDataAndMagnitude parseBase64EncodedVector(DocumentParserContext context, I
11501150
throws IOException {
11511151
// BIG_ENDIAN is the default, but just being explicit here
11521152
ByteBuffer byteBuffer = ByteBuffer.wrap(Base64.getDecoder().decode(context.parser().text())).order(ByteOrder.BIG_ENDIAN);
1153-
if (byteBuffer.remaining() != dims * Float.BYTES) {
1153+
float[] decodedVector = new float[dims];
1154+
if (byteBuffer.remaining() == dims * Float.BYTES) {
1155+
byteBuffer.asFloatBuffer().get(decodedVector);
1156+
} else if (byteBuffer.remaining() == dims * BFloat16.BYTES) {
1157+
BFloat16.bFloat16ToFloat(byteBuffer.asShortBuffer(), decodedVector);
1158+
} else {
11541159
throw new ParsingException(
11551160
context.parser().getTokenLocation(),
11561161
"Failed to parse object: Base64 decoded vector byte length ["
11571162
+ byteBuffer.remaining()
11581163
+ "] does not match the expected length of ["
11591164
+ (dims * Float.BYTES)
1165+
+ "] or ["
1166+
+ (dims * BFloat16.BYTES)
11601167
+ "] for dimension count ["
11611168
+ dims
11621169
+ "]"
11631170
);
11641171
}
1165-
float[] decodedVector = new float[dims];
1166-
byteBuffer.asFloatBuffer().get(decodedVector);
1172+
11671173
dimChecker.accept(decodedVector.length, true);
11681174
VectorData vectorData = VectorData.fromFloats(decodedVector);
11691175
float squaredMagnitude = (float) computeSquaredMagnitude(vectorData);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ public static final class Hamming {
252252
@SuppressWarnings("unchecked")
253253
public Hamming(ScoreScript scoreScript, Object queryVector, String fieldName) {
254254
DenseVectorDocValuesField field = (DenseVectorDocValuesField) scoreScript.field(fieldName);
255-
if (field.getElementType() == DenseVectorFieldMapper.ElementType.FLOAT) {
255+
if (field.getElementType() == DenseVectorFieldMapper.ElementType.FLOAT || field.getElementType() == ElementType.BFLOAT16) {
256256
throw new IllegalArgumentException("hamming distance is only supported for byte or bit vectors");
257257
}
258258
if (queryVector instanceof List) {

0 commit comments

Comments
 (0)