@@ -734,31 +734,29 @@ IndexFieldData.Builder fielddataBuilder(DenseVectorFieldType denseVectorFieldTyp
734734 this ,
735735 denseVectorFieldType .dims ,
736736 denseVectorFieldType .indexed ,
737- denseVectorFieldType .indexVersionCreated .onOrAfter (NORMALIZE_COSINE )
738- && denseVectorFieldType .indexed
739- && denseVectorFieldType .similarity .equals (VectorSimilarity .COSINE ) ? r -> new FilterLeafReader (r ) {
740- @ Override
741- public CacheHelper getCoreCacheHelper () {
742- return r .getCoreCacheHelper ();
743- }
737+ denseVectorFieldType .isNormalized () && denseVectorFieldType .indexed ? r -> new FilterLeafReader (r ) {
738+ @ Override
739+ public CacheHelper getCoreCacheHelper () {
740+ return r .getCoreCacheHelper ();
741+ }
744742
745- @ Override
746- public CacheHelper getReaderCacheHelper () {
747- return r .getReaderCacheHelper ();
748- }
743+ @ Override
744+ public CacheHelper getReaderCacheHelper () {
745+ return r .getReaderCacheHelper ();
746+ }
749747
750- @ Override
751- public FloatVectorValues getFloatVectorValues (String fieldName ) throws IOException {
752- FloatVectorValues values = in .getFloatVectorValues (fieldName );
753- if (values == null ) {
754- return null ;
755- }
756- return new DenormalizedCosineFloatVectorValues (
757- values ,
758- in .getNumericDocValues (fieldName + COSINE_MAGNITUDE_FIELD_SUFFIX )
759- );
748+ @ Override
749+ public FloatVectorValues getFloatVectorValues (String fieldName ) throws IOException {
750+ FloatVectorValues values = in .getFloatVectorValues (fieldName );
751+ if (values == null ) {
752+ return null ;
760753 }
761- } : r -> r
754+ return new DenormalizedCosineFloatVectorValues (
755+ values ,
756+ in .getNumericDocValues (fieldName + COSINE_MAGNITUDE_FIELD_SUFFIX )
757+ );
758+ }
759+ } : r -> r
762760 );
763761 }
764762
@@ -820,9 +818,7 @@ public void parseKnnVectorAndIndex(DocumentParserContext context, DenseVectorFie
820818 fieldMapper .checkDimensionMatches (index , context );
821819 checkVectorBounds (vector );
822820 checkVectorMagnitude (fieldMapper .fieldType ().similarity , errorFloatElementsAppender (vector ), squaredMagnitude );
823- if (fieldMapper .indexCreatedVersion .onOrAfter (NORMALIZE_COSINE )
824- && fieldMapper .fieldType ().similarity .equals (VectorSimilarity .COSINE )
825- && isNotUnitVector (squaredMagnitude )) {
821+ if (fieldMapper .fieldType ().isNormalized () && isNotUnitVector (squaredMagnitude )) {
826822 float length = (float ) Math .sqrt (squaredMagnitude );
827823 for (int i = 0 ; i < vector .length ; i ++) {
828824 vector [i ] /= length ;
@@ -2491,6 +2487,10 @@ public Query createExactKnnQuery(VectorData queryVector, Float vectorSimilarity)
24912487 return knnQuery ;
24922488 }
24932489
2490+ public boolean isNormalized () {
2491+ return indexVersionCreated .onOrAfter (NORMALIZE_COSINE ) && VectorSimilarity .COSINE .equals (similarity );
2492+ }
2493+
24942494 private Query createExactKnnBitQuery (byte [] queryVector ) {
24952495 elementType .checkDimensions (dims , queryVector .length );
24962496 return new DenseVectorQuery .Bytes (queryVector , name ());
@@ -2511,9 +2511,7 @@ private Query createExactKnnFloatQuery(float[] queryVector) {
25112511 if (similarity == VectorSimilarity .DOT_PRODUCT || similarity == VectorSimilarity .COSINE ) {
25122512 float squaredMagnitude = VectorUtil .dotProduct (queryVector , queryVector );
25132513 elementType .checkVectorMagnitude (similarity , ElementType .errorFloatElementsAppender (queryVector ), squaredMagnitude );
2514- if (similarity == VectorSimilarity .COSINE
2515- && indexVersionCreated .onOrAfter (NORMALIZE_COSINE )
2516- && isNotUnitVector (squaredMagnitude )) {
2514+ if (isNormalized () && isNotUnitVector (squaredMagnitude )) {
25172515 float length = (float ) Math .sqrt (squaredMagnitude );
25182516 queryVector = Arrays .copyOf (queryVector , queryVector .length );
25192517 for (int i = 0 ; i < queryVector .length ; i ++) {
@@ -2703,9 +2701,7 @@ private Query createKnnFloatQuery(
27032701 if (similarity == VectorSimilarity .DOT_PRODUCT || similarity == VectorSimilarity .COSINE ) {
27042702 float squaredMagnitude = VectorUtil .dotProduct (queryVector , queryVector );
27052703 elementType .checkVectorMagnitude (similarity , ElementType .errorFloatElementsAppender (queryVector ), squaredMagnitude );
2706- if (similarity == VectorSimilarity .COSINE
2707- && indexVersionCreated .onOrAfter (NORMALIZE_COSINE )
2708- && isNotUnitVector (squaredMagnitude )) {
2704+ if (isNormalized () && isNotUnitVector (squaredMagnitude )) {
27092705 float length = (float ) Math .sqrt (squaredMagnitude );
27102706 queryVector = Arrays .copyOf (queryVector , queryVector .length );
27112707 for (int i = 0 ; i < queryVector .length ; i ++) {
@@ -2795,7 +2791,7 @@ int getVectorDimensions() {
27952791 return dims ;
27962792 }
27972793
2798- ElementType getElementType () {
2794+ public ElementType getElementType () {
27992795 return elementType ;
28002796 }
28012797
@@ -2816,7 +2812,7 @@ public BlockLoader blockLoader(MappedFieldType.BlockLoaderContext blContext) {
28162812 }
28172813
28182814 if (indexed ) {
2819- return new BlockDocValuesReader .DenseVectorBlockLoader (name (), dims , elementType );
2815+ return new BlockDocValuesReader .DenseVectorBlockLoader (name (), dims , this );
28202816 }
28212817
28222818 if (hasDocValues () && (blContext .fieldExtractPreference () != FieldExtractPreference .STORED || isSyntheticSource )) {
0 commit comments