diff --git a/src/main/java/org/opensearch/knn/index/KNNVectorDVLeafFieldData.java b/src/main/java/org/opensearch/knn/index/KNNVectorDVLeafFieldData.java index 914af255d9..b2c3914481 100644 --- a/src/main/java/org/opensearch/knn/index/KNNVectorDVLeafFieldData.java +++ b/src/main/java/org/opensearch/knn/index/KNNVectorDVLeafFieldData.java @@ -58,10 +58,8 @@ public ScriptDocValues getScriptValues() { default: throw new IllegalStateException("Unsupported Lucene vector encoding: " + fieldInfo.getVectorEncoding()); } - } else if (fieldInfo.getDocValuesType() == DocValuesType.BINARY) { - values = DocValues.getBinary(reader, fieldName); } else { - return KNNVectorScriptDocValues.emptyValues(fieldName, vectorDataType); + values = DocValues.getBinary(reader, fieldName); } return KNNVectorScriptDocValues.create(values, fieldName, vectorDataType); } catch (IOException e) { diff --git a/src/main/java/org/opensearch/knn/index/mapper/KNNVectorFieldMapper.java b/src/main/java/org/opensearch/knn/index/mapper/KNNVectorFieldMapper.java index 6c139bce52..22b7b5be29 100644 --- a/src/main/java/org/opensearch/knn/index/mapper/KNNVectorFieldMapper.java +++ b/src/main/java/org/opensearch/knn/index/mapper/KNNVectorFieldMapper.java @@ -551,9 +551,9 @@ private MethodComponentContext getMethodComponentContext(KNNMethodContext knnMet * @param fieldType {@link FieldType} * @return {@link List} of {@link Field} */ - protected List getFieldsForFloatVector(final float[] array, final FieldType fieldType) { + protected List getFieldsForFloatVector(final float[] array, final FieldType fieldType, final SpaceType spaceType) { final List fields = new ArrayList<>(); - fields.add(new VectorField(name(), array, fieldType)); + fields.add(createVectorField(array, dimension, spaceType, fieldType)); if (this.stored) { fields.add(createStoredFieldForFloatVector(name(), array)); } @@ -567,20 +567,20 @@ protected List getFieldsForFloatVector(final float[] array, final FieldTy * @param fieldType {@link FieldType} * @return {@link List} of {@link Field} */ - protected List getFieldsForByteVector(final byte[] array, final FieldType fieldType) { + protected List getFieldsForByteVector(final byte[] array, final FieldType fieldType, final SpaceType spaceType) { final List fields = new ArrayList<>(); - fields.add(new VectorField(name(), array, fieldType)); + fields.add(createVectorField(array, dimension, spaceType, fieldType)); if (this.stored) { fields.add(createStoredFieldForByteVector(name(), array)); } return fields; } - protected Field createVectorField(float[] vectorValue, int dimension, SpaceType spaceType) { + protected Field createVectorField(float[] vectorValue, int dimension, final SpaceType spaceType, final FieldType fieldType) { // Because we will come to this function only in case when Native engines are getting used. So I am avoiding the // check of use Native engines here. // Also dimension field is only accessible here hence we have to use this function to create fieldType too - if (this.indexCreatedVersion.onOrAfter(Version.V_2_15_0) && SpaceType.VECTOR_FIELD_SUPPORTED_SPACE_TYPES.contains(spaceType)) { + if (this.indexCreatedVersion.onOrAfter(Version.V_3_0_0) && SpaceType.VECTOR_FIELD_SUPPORTED_SPACE_TYPES.contains(spaceType)) { FieldType tempFieldType = new FieldType(fieldType); tempFieldType.setVectorAttributes(dimension, VectorEncoding.FLOAT32, spaceType.getVectorSimilarityFunction()); tempFieldType.freeze(); @@ -589,11 +589,11 @@ protected Field createVectorField(float[] vectorValue, int dimension, SpaceType return new VectorField(name(), vectorValue, fieldType); } - protected Field createVectorField(byte[] vectorValue, int dimension, SpaceType spaceType) { + protected Field createVectorField(byte[] vectorValue, int dimension, final SpaceType spaceType, final FieldType fieldType) { // Because we will come to this function only in case when Native engines are getting used. So I am avoiding the // check of use Native engines here. // Also dimension field is only accessible here hence we have to use this function to create fieldType too - if (this.indexCreatedVersion.onOrAfter(Version.V_2_15_0) && SpaceType.VECTOR_FIELD_SUPPORTED_SPACE_TYPES.contains(spaceType)) { + if (this.indexCreatedVersion.onOrAfter(Version.V_3_0_0) && SpaceType.VECTOR_FIELD_SUPPORTED_SPACE_TYPES.contains(spaceType)) { FieldType tempFieldType = new FieldType(fieldType); tempFieldType.setVectorAttributes(dimension, VectorEncoding.BYTE, spaceType.getVectorSimilarityFunction()); tempFieldType.freeze(); @@ -616,7 +616,7 @@ protected void parseCreateField(ParseContext context, int dimension, SpaceType s } final byte[] array = bytesArrayOptional.get(); spaceType.validateVector(array); - context.doc().addAll(getFieldsForByteVector(array, fieldType)); + context.doc().addAll(getFieldsForByteVector(array, fieldType, spaceType)); } else if (VectorDataType.FLOAT == vectorDataType) { Optional floatsArrayOptional = getFloatsFromContext(context, dimension, methodComponentContext); @@ -625,7 +625,7 @@ protected void parseCreateField(ParseContext context, int dimension, SpaceType s } final float[] array = floatsArrayOptional.get(); spaceType.validateVector(array); - context.doc().addAll(getFieldsForFloatVector(array, fieldType)); + context.doc().addAll(getFieldsForFloatVector(array, fieldType, spaceType)); } else { throw new IllegalArgumentException( String.format(Locale.ROOT, "Cannot parse context for unsupported values provided for field [%s]", VECTOR_DATA_TYPE_FIELD) diff --git a/src/main/java/org/opensearch/knn/index/mapper/LuceneFieldMapper.java b/src/main/java/org/opensearch/knn/index/mapper/LuceneFieldMapper.java index 59f4867dd2..6a2dad5118 100644 --- a/src/main/java/org/opensearch/knn/index/mapper/LuceneFieldMapper.java +++ b/src/main/java/org/opensearch/knn/index/mapper/LuceneFieldMapper.java @@ -18,6 +18,7 @@ import org.apache.lucene.index.VectorSimilarityFunction; import org.opensearch.common.Explicit; import org.opensearch.knn.index.KNNMethodContext; +import org.opensearch.knn.index.SpaceType; import org.opensearch.knn.index.VectorDataType; import org.opensearch.knn.index.VectorField; import org.opensearch.knn.index.util.KNNEngine; @@ -74,7 +75,7 @@ public class LuceneFieldMapper extends KNNVectorFieldMapper { } @Override - protected List getFieldsForFloatVector(final float[] array, final FieldType fieldType) { + protected List getFieldsForFloatVector(final float[] array, final FieldType fieldType, final SpaceType spaceType) { final List fieldsToBeAdded = new ArrayList<>(); fieldsToBeAdded.add(new KnnVectorField(name(), array, fieldType)); @@ -89,7 +90,7 @@ protected List getFieldsForFloatVector(final float[] array, final FieldTy } @Override - protected List getFieldsForByteVector(final byte[] array, final FieldType fieldType) { + protected List getFieldsForByteVector(final byte[] array, final FieldType fieldType, final SpaceType spaceType) { final List fieldsToBeAdded = new ArrayList<>(); fieldsToBeAdded.add(new KnnByteVectorField(name(), array, fieldType));