You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2021/07/19 07:48:17 UTC

[lucene] branch main updated: LUCENE-10016: Remove VectorValues#getSimilarityFunction. (#213)

This is an automated email from the ASF dual-hosted git repository.

jpountz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/lucene.git


The following commit(s) were added to refs/heads/main by this push:
     new acf45d8  LUCENE-10016: Remove VectorValues#getSimilarityFunction. (#213)
acf45d8 is described below

commit acf45d8a315f94c4bf685458faa1aae24c1e8599
Author: Adrien Grand <jp...@gmail.com>
AuthorDate: Mon Jul 19 09:48:09 2021 +0200

    LUCENE-10016: Remove VectorValues#getSimilarityFunction. (#213)
    
    VectorValues is only about iterating over vectors in doc ID order, so it feels
    wrong to tie it to the similarity function.
---
 .../lucene60/Lucene60FieldInfosFormat.java         |   4 +-
 .../simpletext/SimpleTextFieldInfosFormat.java     |   8 +-
 .../codecs/simpletext/SimpleTextVectorReader.java  |  21 +--
 .../codecs/simpletext/SimpleTextVectorWriter.java  |   2 -
 .../codecs/uniformsplit/TestBlockWriter.java       |   4 +-
 .../sharedterms/TestSTBlockReader.java             |   4 +-
 .../org/apache/lucene/codecs/VectorWriter.java     |  15 +--
 .../codecs/lucene90/Lucene90FieldInfosFormat.java  |  14 +-
 .../codecs/lucene90/Lucene90HnswVectorReader.java  |  33 ++---
 .../codecs/lucene90/Lucene90HnswVectorWriter.java  |  10 +-
 .../java/org/apache/lucene/document/FieldType.java |   8 +-
 .../org/apache/lucene/document/VectorField.java    |  11 +-
 .../java/org/apache/lucene/index/FieldInfo.java    |  14 +-
 .../java/org/apache/lucene/index/FieldInfos.java   |   8 +-
 .../apache/lucene/index/IndexableFieldType.java    |   4 +-
 .../org/apache/lucene/index/IndexingChain.java     |   9 +-
 .../lucene/index/RandomAccessVectorValues.java     |   3 -
 .../lucene/index/VectorSimilarityFunction.java     |  76 +++++++++++
 .../java/org/apache/lucene/index/VectorValues.java |  66 ----------
 .../apache/lucene/index/VectorValuesWriter.java    |  31 +----
 .../org/apache/lucene/util/hnsw/HnswGraph.java     |   4 +-
 .../apache/lucene/util/hnsw/HnswGraphBuilder.java  |  17 ++-
 .../lucene/document/TestPerFieldConsistency.java   |  10 +-
 .../test/org/apache/lucene/index/TestCodecs.java   |   2 +-
 .../apache/lucene/index/TestDocumentWriter.java    |   3 +-
 .../org/apache/lucene/index/TestFieldInfos.java    |   6 +-
 .../org/apache/lucene/index/TestFieldsReader.java  |   2 +-
 .../apache/lucene/index/TestIndexableField.java    |   4 +-
 .../test/org/apache/lucene/index/TestKnnGraph.java |  12 +-
 .../lucene/index/TestPendingSoftDeletes.java       |   2 +-
 .../apache/lucene/util/hnsw/KnnGraphTester.java    |  17 +--
 .../apache/lucene/util/hnsw/MockVectorValues.java  |  11 +-
 .../test/org/apache/lucene/util/hnsw/TestHnsw.java |  71 ++++++----
 .../search/highlight/TermVectorLeafReader.java     |   3 +-
 .../codecs/asserting/AssertingVectorFormat.java    |   1 -
 .../lucene/index/BaseFieldInfoFormatTestCase.java  |   6 +-
 .../lucene/index/BaseVectorFormatTestCase.java     | 145 ++++++++++-----------
 .../apache/lucene/index/RandomPostingsTester.java  |   4 +-
 38 files changed, 312 insertions(+), 353 deletions(-)

diff --git a/lucene/backward-codecs/src/java/org/apache/lucene/backward_codecs/lucene60/Lucene60FieldInfosFormat.java b/lucene/backward-codecs/src/java/org/apache/lucene/backward_codecs/lucene60/Lucene60FieldInfosFormat.java
index e3b5a9b..4266fc3 100644
--- a/lucene/backward-codecs/src/java/org/apache/lucene/backward_codecs/lucene60/Lucene60FieldInfosFormat.java
+++ b/lucene/backward-codecs/src/java/org/apache/lucene/backward_codecs/lucene60/Lucene60FieldInfosFormat.java
@@ -30,7 +30,7 @@ import org.apache.lucene.index.FieldInfos;
 import org.apache.lucene.index.IndexFileNames;
 import org.apache.lucene.index.IndexOptions;
 import org.apache.lucene.index.SegmentInfo;
-import org.apache.lucene.index.VectorValues;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.store.ChecksumIndexInput;
 import org.apache.lucene.store.DataOutput;
 import org.apache.lucene.store.Directory;
@@ -214,7 +214,7 @@ public final class Lucene60FieldInfosFormat extends FieldInfosFormat {
                 pointIndexDimensionCount,
                 pointNumBytes,
                 0,
-                VectorValues.SimilarityFunction.NONE,
+                VectorSimilarityFunction.NONE,
                 isSoftDeletesField);
       } catch (IllegalStateException e) {
         throw new CorruptIndexException(
diff --git a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextFieldInfosFormat.java b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextFieldInfosFormat.java
index 64e9e64..3a02b47 100644
--- a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextFieldInfosFormat.java
+++ b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextFieldInfosFormat.java
@@ -28,7 +28,7 @@ import org.apache.lucene.index.FieldInfos;
 import org.apache.lucene.index.IndexFileNames;
 import org.apache.lucene.index.IndexOptions;
 import org.apache.lucene.index.SegmentInfo;
-import org.apache.lucene.index.VectorValues;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.store.ChecksumIndexInput;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.IOContext;
@@ -158,7 +158,7 @@ public class SimpleTextFieldInfosFormat extends FieldInfosFormat {
         SimpleTextUtil.readLine(input, scratch);
         assert StringHelper.startsWith(scratch.get(), VECTOR_SEARCH_STRATEGY);
         String scoreFunction = readString(VECTOR_SEARCH_STRATEGY.length, scratch);
-        VectorValues.SimilarityFunction vectorDistFunc = distanceFunction(scoreFunction);
+        VectorSimilarityFunction vectorDistFunc = distanceFunction(scoreFunction);
 
         SimpleTextUtil.readLine(input, scratch);
         assert StringHelper.startsWith(scratch.get(), SOFT_DELETES);
@@ -201,8 +201,8 @@ public class SimpleTextFieldInfosFormat extends FieldInfosFormat {
     return DocValuesType.valueOf(dvType);
   }
 
-  public VectorValues.SimilarityFunction distanceFunction(String scoreFunction) {
-    return VectorValues.SimilarityFunction.valueOf(scoreFunction);
+  public VectorSimilarityFunction distanceFunction(String scoreFunction) {
+    return VectorSimilarityFunction.valueOf(scoreFunction);
   }
 
   private String readString(int offset, BytesRefBuilder scratch) {
diff --git a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextVectorReader.java b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextVectorReader.java
index 5f779a5..7c635a7 100644
--- a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextVectorReader.java
+++ b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextVectorReader.java
@@ -81,9 +81,6 @@ public class SimpleTextVectorReader extends VectorReader {
       int fieldNumber = readInt(in, FIELD_NUMBER);
       while (fieldNumber != -1) {
         String fieldName = readString(in, FIELD_NAME);
-        String scoreFunctionName = readString(in, SCORE_FUNCTION);
-        VectorValues.SimilarityFunction similarityFunction =
-            VectorValues.SimilarityFunction.valueOf(scoreFunctionName);
         long vectorDataOffset = readLong(in, VECTOR_DATA_OFFSET);
         long vectorDataLength = readLong(in, VECTOR_DATA_LENGTH);
         int dimension = readInt(in, VECTOR_DIMENSION);
@@ -94,9 +91,7 @@ public class SimpleTextVectorReader extends VectorReader {
         }
         assert fieldEntries.containsKey(fieldName) == false;
         fieldEntries.put(
-            fieldName,
-            new FieldEntry(
-                dimension, similarityFunction, vectorDataOffset, vectorDataLength, docIds));
+            fieldName, new FieldEntry(dimension, vectorDataOffset, vectorDataLength, docIds));
         fieldNumber = readInt(in, FIELD_NUMBER);
       }
       SimpleTextUtil.checkFooter(in);
@@ -205,20 +200,13 @@ public class SimpleTextVectorReader extends VectorReader {
   private static class FieldEntry {
 
     final int dimension;
-    final VectorValues.SimilarityFunction similarityFunction;
 
     final long vectorDataOffset;
     final long vectorDataLength;
     final int[] ordToDoc;
 
-    FieldEntry(
-        int dimension,
-        VectorValues.SimilarityFunction similarityFunction,
-        long vectorDataOffset,
-        long vectorDataLength,
-        int[] ordToDoc) {
+    FieldEntry(int dimension, long vectorDataOffset, long vectorDataLength, int[] ordToDoc) {
       this.dimension = dimension;
-      this.similarityFunction = similarityFunction;
       this.vectorDataOffset = vectorDataOffset;
       this.vectorDataLength = vectorDataLength;
       this.ordToDoc = ordToDoc;
@@ -261,11 +249,6 @@ public class SimpleTextVectorReader extends VectorReader {
     }
 
     @Override
-    public SimilarityFunction similarityFunction() {
-      return entry.similarityFunction;
-    }
-
-    @Override
     public float[] vectorValue() {
       return values[curOrd];
     }
diff --git a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextVectorWriter.java b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextVectorWriter.java
index 308bd53..1bba30c 100644
--- a/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextVectorWriter.java
+++ b/lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextVectorWriter.java
@@ -38,7 +38,6 @@ public class SimpleTextVectorWriter extends VectorWriter {
 
   static final BytesRef FIELD_NUMBER = new BytesRef("field-number ");
   static final BytesRef FIELD_NAME = new BytesRef("field-name ");
-  static final BytesRef SCORE_FUNCTION = new BytesRef("score-function ");
   static final BytesRef VECTOR_DATA_OFFSET = new BytesRef("vector-data-offset ");
   static final BytesRef VECTOR_DATA_LENGTH = new BytesRef("vector-data-length ");
   static final BytesRef VECTOR_DIMENSION = new BytesRef("vector-dimension ");
@@ -96,7 +95,6 @@ public class SimpleTextVectorWriter extends VectorWriter {
       throws IOException {
     writeField(meta, FIELD_NUMBER, field.number);
     writeField(meta, FIELD_NAME, field.name);
-    writeField(meta, SCORE_FUNCTION, field.getVectorSimilarityFunction().name());
     writeField(meta, VECTOR_DATA_OFFSET, vectorDataOffset);
     writeField(meta, VECTOR_DATA_LENGTH, vectorDataLength);
     writeField(meta, VECTOR_DIMENSION, field.getVectorDimension());
diff --git a/lucene/codecs/src/test/org/apache/lucene/codecs/uniformsplit/TestBlockWriter.java b/lucene/codecs/src/test/org/apache/lucene/codecs/uniformsplit/TestBlockWriter.java
index b885918..b9bb0fa 100644
--- a/lucene/codecs/src/test/org/apache/lucene/codecs/uniformsplit/TestBlockWriter.java
+++ b/lucene/codecs/src/test/org/apache/lucene/codecs/uniformsplit/TestBlockWriter.java
@@ -23,7 +23,7 @@ import org.apache.lucene.codecs.lucene90.MockTermStateFactory;
 import org.apache.lucene.index.DocValuesType;
 import org.apache.lucene.index.FieldInfo;
 import org.apache.lucene.index.IndexOptions;
-import org.apache.lucene.index.VectorValues;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.store.ByteBuffersDataOutput;
 import org.apache.lucene.store.ByteBuffersIndexOutput;
 import org.apache.lucene.util.BytesRef;
@@ -116,7 +116,7 @@ public class TestBlockWriter extends LuceneTestCase {
         0,
         0,
         0,
-        VectorValues.SimilarityFunction.NONE,
+        VectorSimilarityFunction.NONE,
         true);
   }
 }
diff --git a/lucene/codecs/src/test/org/apache/lucene/codecs/uniformsplit/sharedterms/TestSTBlockReader.java b/lucene/codecs/src/test/org/apache/lucene/codecs/uniformsplit/sharedterms/TestSTBlockReader.java
index 78f9793..b30a32d 100644
--- a/lucene/codecs/src/test/org/apache/lucene/codecs/uniformsplit/sharedterms/TestSTBlockReader.java
+++ b/lucene/codecs/src/test/org/apache/lucene/codecs/uniformsplit/sharedterms/TestSTBlockReader.java
@@ -41,7 +41,7 @@ import org.apache.lucene.index.ImpactsEnum;
 import org.apache.lucene.index.IndexOptions;
 import org.apache.lucene.index.PostingsEnum;
 import org.apache.lucene.index.SegmentReadState;
-import org.apache.lucene.index.VectorValues;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.store.ByteBuffersDirectory;
 import org.apache.lucene.store.DataInput;
 import org.apache.lucene.store.Directory;
@@ -203,7 +203,7 @@ public class TestSTBlockReader extends LuceneTestCase {
         0,
         0,
         0,
-        VectorValues.SimilarityFunction.NONE,
+        VectorSimilarityFunction.NONE,
         false);
   }
 
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/VectorWriter.java b/lucene/core/src/java/org/apache/lucene/codecs/VectorWriter.java
index 90d9acc..433009e 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/VectorWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/VectorWriter.java
@@ -29,6 +29,7 @@ import org.apache.lucene.index.FieldInfo;
 import org.apache.lucene.index.MergeState;
 import org.apache.lucene.index.RandomAccessVectorValues;
 import org.apache.lucene.index.RandomAccessVectorValuesProducer;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.index.VectorValues;
 import org.apache.lucene.util.BytesRef;
 
@@ -68,14 +69,14 @@ public abstract class VectorWriter implements Closeable {
     }
     List<VectorValuesSub> subs = new ArrayList<>();
     int dimension = -1;
-    VectorValues.SimilarityFunction similarityFunction = null;
+    VectorSimilarityFunction similarityFunction = null;
     int nonEmptySegmentIndex = 0;
     for (int i = 0; i < mergeState.vectorReaders.length; i++) {
       VectorReader vectorReader = mergeState.vectorReaders[i];
       if (vectorReader != null) {
         if (mergeFieldInfo != null && mergeFieldInfo.hasVectorValues()) {
           int segmentDimension = mergeFieldInfo.getVectorDimension();
-          VectorValues.SimilarityFunction segmentSimilarityFunction =
+          VectorSimilarityFunction segmentSimilarityFunction =
               mergeFieldInfo.getVectorSimilarityFunction();
           if (dimension == -1) {
             dimension = segmentDimension;
@@ -238,11 +239,6 @@ public abstract class VectorWriter implements Closeable {
       return subs.get(0).values.dimension();
     }
 
-    @Override
-    public SimilarityFunction similarityFunction() {
-      return subs.get(0).values.similarityFunction();
-    }
-
     class MergerRandomAccess implements RandomAccessVectorValues {
 
       private final List<RandomAccessVectorValues> raSubs;
@@ -270,11 +266,6 @@ public abstract class VectorWriter implements Closeable {
       }
 
       @Override
-      public SimilarityFunction similarityFunction() {
-        return VectorValuesMerger.this.similarityFunction();
-      }
-
-      @Override
       public float[] vectorValue(int target) throws IOException {
         int unmappedOrd = ordMap[target];
         int segmentOrd = Arrays.binarySearch(ordBase, unmappedOrd);
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90FieldInfosFormat.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90FieldInfosFormat.java
index d0c9926..31ee09b 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90FieldInfosFormat.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90FieldInfosFormat.java
@@ -29,7 +29,7 @@ import org.apache.lucene.index.FieldInfos;
 import org.apache.lucene.index.IndexFileNames;
 import org.apache.lucene.index.IndexOptions;
 import org.apache.lucene.index.SegmentInfo;
-import org.apache.lucene.index.VectorValues.SimilarityFunction;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.store.ChecksumIndexInput;
 import org.apache.lucene.store.DataOutput;
 import org.apache.lucene.store.Directory;
@@ -102,8 +102,8 @@ import org.apache.lucene.store.IndexOutput;
  *   <li>VectorDistFunction: a byte containing distance function used for similarity calculation.
  *       <ul>
  *         <li>0: no distance function is defined for this field.
- *         <li>1: EUCLIDEAN_HNSW distance. ({@link SimilarityFunction#EUCLIDEAN})
- *         <li>2: DOT_PRODUCT_HNSW score. ({@link SimilarityFunction#DOT_PRODUCT})
+ *         <li>1: EUCLIDEAN_HNSW distance. ({@link VectorSimilarityFunction#EUCLIDEAN})
+ *         <li>2: DOT_PRODUCT_HNSW score. ({@link VectorSimilarityFunction#DOT_PRODUCT})
  *       </ul>
  * </ul>
  *
@@ -172,7 +172,7 @@ public final class Lucene90FieldInfosFormat extends FieldInfosFormat {
             pointNumBytes = 0;
           }
           final int vectorDimension = input.readVInt();
-          final SimilarityFunction vectorDistFunc = getDistFunc(input, input.readByte());
+          final VectorSimilarityFunction vectorDistFunc = getDistFunc(input, input.readByte());
 
           try {
             infos[i] =
@@ -253,11 +253,11 @@ public final class Lucene90FieldInfosFormat extends FieldInfosFormat {
     }
   }
 
-  private static SimilarityFunction getDistFunc(IndexInput input, byte b) throws IOException {
-    if (b < 0 || b >= SimilarityFunction.values().length) {
+  private static VectorSimilarityFunction getDistFunc(IndexInput input, byte b) throws IOException {
+    if (b < 0 || b >= VectorSimilarityFunction.values().length) {
       throw new CorruptIndexException("invalid distance function: " + b, input);
     }
-    return SimilarityFunction.values()[b];
+    return VectorSimilarityFunction.values()[b];
   }
 
   static {
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90HnswVectorReader.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90HnswVectorReader.java
index 08e8694..e5bdf4d 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90HnswVectorReader.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90HnswVectorReader.java
@@ -35,6 +35,7 @@ import org.apache.lucene.index.KnnGraphValues;
 import org.apache.lucene.index.RandomAccessVectorValues;
 import org.apache.lucene.index.RandomAccessVectorValuesProducer;
 import org.apache.lucene.index.SegmentReadState;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.index.VectorValues;
 import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.TopDocs;
@@ -187,19 +188,18 @@ public final class Lucene90HnswVectorReader extends VectorReader {
     }
   }
 
-  private VectorValues.SimilarityFunction readSimilarityFunction(DataInput input)
-      throws IOException {
+  private VectorSimilarityFunction readSimilarityFunction(DataInput input) throws IOException {
     int similarityFunctionId = input.readInt();
     if (similarityFunctionId < 0
-        || similarityFunctionId >= VectorValues.SimilarityFunction.values().length) {
+        || similarityFunctionId >= VectorSimilarityFunction.values().length) {
       throw new CorruptIndexException(
           "Invalid similarity function id: " + similarityFunctionId, input);
     }
-    return VectorValues.SimilarityFunction.values()[similarityFunctionId];
+    return VectorSimilarityFunction.values()[similarityFunctionId];
   }
 
   private FieldEntry readField(DataInput input) throws IOException {
-    VectorValues.SimilarityFunction similarityFunction = readSimilarityFunction(input);
+    VectorSimilarityFunction similarityFunction = readSimilarityFunction(input);
     switch (similarityFunction) {
       case NONE:
         return new FieldEntry(input, similarityFunction);
@@ -252,7 +252,14 @@ public final class Lucene90HnswVectorReader extends VectorReader {
     // use a seed that is fixed for the index so we get reproducible results for the same query
     final Random random = new Random(checksumSeed);
     NeighborQueue results =
-        HnswGraph.search(target, k, k, vectorValues, getGraphValues(fieldEntry), random);
+        HnswGraph.search(
+            target,
+            k,
+            k,
+            vectorValues,
+            fieldEntry.similarityFunction,
+            getGraphValues(fieldEntry),
+            random);
     int i = 0;
     ScoreDoc[] scoreDocs = new ScoreDoc[Math.min(results.size(), k)];
     boolean reversed = fieldEntry.similarityFunction.reversed;
@@ -292,7 +299,7 @@ public final class Lucene90HnswVectorReader extends VectorReader {
   }
 
   private KnnGraphValues getGraphValues(FieldEntry entry) throws IOException {
-    if (entry.similarityFunction != VectorValues.SimilarityFunction.NONE) {
+    if (entry.similarityFunction != VectorSimilarityFunction.NONE) {
       HnswGraphFieldEntry graphEntry = (HnswGraphFieldEntry) entry;
       IndexInput bytesSlice =
           vectorIndex.slice("graph-data", entry.indexDataOffset, entry.indexDataLength);
@@ -310,7 +317,7 @@ public final class Lucene90HnswVectorReader extends VectorReader {
   private static class FieldEntry {
 
     final int dimension;
-    final VectorValues.SimilarityFunction similarityFunction;
+    final VectorSimilarityFunction similarityFunction;
 
     final long vectorDataOffset;
     final long vectorDataLength;
@@ -318,8 +325,7 @@ public final class Lucene90HnswVectorReader extends VectorReader {
     final long indexDataLength;
     final int[] ordToDoc;
 
-    FieldEntry(DataInput input, VectorValues.SimilarityFunction similarityFunction)
-        throws IOException {
+    FieldEntry(DataInput input, VectorSimilarityFunction similarityFunction) throws IOException {
       this.similarityFunction = similarityFunction;
       vectorDataOffset = input.readVLong();
       vectorDataLength = input.readVLong();
@@ -343,7 +349,7 @@ public final class Lucene90HnswVectorReader extends VectorReader {
 
     final long[] ordOffsets;
 
-    HnswGraphFieldEntry(DataInput input, VectorValues.SimilarityFunction similarityFunction)
+    HnswGraphFieldEntry(DataInput input, VectorSimilarityFunction similarityFunction)
         throws IOException {
       super(input, similarityFunction);
       ordOffsets = new long[size()];
@@ -390,11 +396,6 @@ public final class Lucene90HnswVectorReader extends VectorReader {
     }
 
     @Override
-    public SimilarityFunction similarityFunction() {
-      return fieldEntry.similarityFunction;
-    }
-
-    @Override
     public float[] vectorValue() throws IOException {
       dataIn.seek((long) ord * byteSize);
       dataIn.readFloats(value, 0, value.length);
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90HnswVectorWriter.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90HnswVectorWriter.java
index 7cb8f7c..c35ad2c 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90HnswVectorWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene90/Lucene90HnswVectorWriter.java
@@ -27,6 +27,7 @@ import org.apache.lucene.index.FieldInfo;
 import org.apache.lucene.index.IndexFileNames;
 import org.apache.lucene.index.RandomAccessVectorValuesProducer;
 import org.apache.lucene.index.SegmentWriteState;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.index.VectorValues;
 import org.apache.lucene.store.IndexOutput;
 import org.apache.lucene.util.BytesRef;
@@ -126,11 +127,12 @@ public final class Lucene90HnswVectorWriter extends VectorWriter {
     long[] offsets = new long[count];
     long vectorDataLength = vectorData.getFilePointer() - vectorDataOffset;
     long vectorIndexOffset = vectorIndex.getFilePointer();
-    if (vectors.similarityFunction() != VectorValues.SimilarityFunction.NONE) {
+    if (fieldInfo.getVectorSimilarityFunction() != VectorSimilarityFunction.NONE) {
       if (vectors instanceof RandomAccessVectorValuesProducer) {
         writeGraph(
             vectorIndex,
             (RandomAccessVectorValuesProducer) vectors,
+            fieldInfo.getVectorSimilarityFunction(),
             vectorIndexOffset,
             offsets,
             count,
@@ -150,7 +152,7 @@ public final class Lucene90HnswVectorWriter extends VectorWriter {
         vectorIndexLength,
         count,
         docIds);
-    if (vectors.similarityFunction() != VectorValues.SimilarityFunction.NONE) {
+    if (fieldInfo.getVectorSimilarityFunction() != VectorSimilarityFunction.NONE) {
       writeGraphOffsets(meta, offsets);
     }
   }
@@ -196,6 +198,7 @@ public final class Lucene90HnswVectorWriter extends VectorWriter {
   private void writeGraph(
       IndexOutput graphData,
       RandomAccessVectorValuesProducer vectorValues,
+      VectorSimilarityFunction similarityFunction,
       long graphDataOffset,
       long[] offsets,
       int count,
@@ -203,7 +206,8 @@ public final class Lucene90HnswVectorWriter extends VectorWriter {
       int beamWidth)
       throws IOException {
     HnswGraphBuilder hnswGraphBuilder =
-        new HnswGraphBuilder(vectorValues, maxConn, beamWidth, HnswGraphBuilder.randSeed);
+        new HnswGraphBuilder(
+            vectorValues, similarityFunction, maxConn, beamWidth, HnswGraphBuilder.randSeed);
     hnswGraphBuilder.setInfoStream(segmentWriteState.infoStream);
     HnswGraph graph = hnswGraphBuilder.build(vectorValues.randomAccess());
 
diff --git a/lucene/core/src/java/org/apache/lucene/document/FieldType.java b/lucene/core/src/java/org/apache/lucene/document/FieldType.java
index 19dd2aa..f777ea5 100644
--- a/lucene/core/src/java/org/apache/lucene/document/FieldType.java
+++ b/lucene/core/src/java/org/apache/lucene/document/FieldType.java
@@ -23,6 +23,7 @@ import org.apache.lucene.index.DocValuesType;
 import org.apache.lucene.index.IndexOptions;
 import org.apache.lucene.index.IndexableFieldType;
 import org.apache.lucene.index.PointValues;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.index.VectorValues;
 
 /** Describes the properties of a field. */
@@ -42,8 +43,7 @@ public class FieldType implements IndexableFieldType {
   private int indexDimensionCount;
   private int dimensionNumBytes;
   private int vectorDimension;
-  private VectorValues.SimilarityFunction vectorSimilarityFunction =
-      VectorValues.SimilarityFunction.NONE;
+  private VectorSimilarityFunction vectorSimilarityFunction = VectorSimilarityFunction.NONE;
   private Map<String, String> attributes;
 
   /** Create a new mutable FieldType with all of the properties from <code>ref</code> */
@@ -371,7 +371,7 @@ public class FieldType implements IndexableFieldType {
 
   /** Enable vector indexing, with the specified number of dimensions and distance function. */
   public void setVectorDimensionsAndSimilarityFunction(
-      int numDimensions, VectorValues.SimilarityFunction distFunc) {
+      int numDimensions, VectorSimilarityFunction distFunc) {
     checkIfFrozen();
     if (numDimensions <= 0) {
       throw new IllegalArgumentException("vector numDimensions must be > 0; got " + numDimensions);
@@ -393,7 +393,7 @@ public class FieldType implements IndexableFieldType {
   }
 
   @Override
-  public VectorValues.SimilarityFunction vectorSimilarityFunction() {
+  public VectorSimilarityFunction vectorSimilarityFunction() {
     return vectorSimilarityFunction;
   }
 
diff --git a/lucene/core/src/java/org/apache/lucene/document/VectorField.java b/lucene/core/src/java/org/apache/lucene/document/VectorField.java
index 7e7d3f4..e4e6d13 100644
--- a/lucene/core/src/java/org/apache/lucene/document/VectorField.java
+++ b/lucene/core/src/java/org/apache/lucene/document/VectorField.java
@@ -17,6 +17,7 @@
 
 package org.apache.lucene.document;
 
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.index.VectorValues;
 
 /**
@@ -33,8 +34,7 @@ import org.apache.lucene.index.VectorValues;
  */
 public class VectorField extends Field {
 
-  private static FieldType createType(
-      float[] v, VectorValues.SimilarityFunction similarityFunction) {
+  private static FieldType createType(float[] v, VectorSimilarityFunction similarityFunction) {
     if (v == null) {
       throw new IllegalArgumentException("vector value must not be null");
     }
@@ -63,7 +63,7 @@ public class VectorField extends Field {
    * @throws IllegalArgumentException if any parameter is null, or has dimension &gt; 1024.
    */
   public static FieldType createFieldType(
-      int dimension, VectorValues.SimilarityFunction similarityFunction) {
+      int dimension, VectorSimilarityFunction similarityFunction) {
     FieldType type = new FieldType();
     type.setVectorDimensionsAndSimilarityFunction(dimension, similarityFunction);
     type.freeze();
@@ -82,8 +82,7 @@ public class VectorField extends Field {
    * @throws IllegalArgumentException if any parameter is null, or the vector is empty or has
    *     dimension &gt; 1024.
    */
-  public VectorField(
-      String name, float[] vector, VectorValues.SimilarityFunction similarityFunction) {
+  public VectorField(String name, float[] vector, VectorSimilarityFunction similarityFunction) {
     super(name, createType(vector, similarityFunction));
     fieldsData = vector;
   }
@@ -99,7 +98,7 @@ public class VectorField extends Field {
    *     dimension &gt; 1024.
    */
   public VectorField(String name, float[] vector) {
-    this(name, vector, VectorValues.SimilarityFunction.EUCLIDEAN);
+    this(name, vector, VectorSimilarityFunction.EUCLIDEAN);
   }
 
   /**
diff --git a/lucene/core/src/java/org/apache/lucene/index/FieldInfo.java b/lucene/core/src/java/org/apache/lucene/index/FieldInfo.java
index 656077f..bc1b507 100644
--- a/lucene/core/src/java/org/apache/lucene/index/FieldInfo.java
+++ b/lucene/core/src/java/org/apache/lucene/index/FieldInfo.java
@@ -56,7 +56,7 @@ public final class FieldInfo {
 
   // if it is a positive value, it means this field indexes vectors
   private final int vectorDimension;
-  private final VectorValues.SimilarityFunction vectorSimilarityFunction;
+  private final VectorSimilarityFunction vectorSimilarityFunction;
 
   // whether this field is used as the soft-deletes field
   private final boolean softDeletesField;
@@ -80,7 +80,7 @@ public final class FieldInfo {
       int pointIndexDimensionCount,
       int pointNumBytes,
       int vectorDimension,
-      VectorValues.SimilarityFunction vectorSimilarityFunction,
+      VectorSimilarityFunction vectorSimilarityFunction,
       boolean softDeletesField) {
     this.name = Objects.requireNonNull(name);
     this.number = number;
@@ -202,7 +202,7 @@ public final class FieldInfo {
       throw new IllegalArgumentException(
           "vectorDimension must be >=0; got " + vectorDimension + " (field: '" + name + "')");
     }
-    if (vectorDimension == 0 && vectorSimilarityFunction != VectorValues.SimilarityFunction.NONE) {
+    if (vectorDimension == 0 && vectorSimilarityFunction != VectorSimilarityFunction.NONE) {
       throw new IllegalArgumentException(
           "vector similarity function must be NONE when dimension = 0; got "
               + vectorSimilarityFunction
@@ -355,9 +355,9 @@ public final class FieldInfo {
   static void verifySameVectorOptions(
       String fieldName,
       int vd1,
-      VectorValues.SimilarityFunction vsf1,
+      VectorSimilarityFunction vsf1,
       int vd2,
-      VectorValues.SimilarityFunction vsf2) {
+      VectorSimilarityFunction vsf2) {
     if (vd1 != vd2 || vsf1 != vsf2) {
       throw new IllegalArgumentException(
           "cannot change field \""
@@ -478,8 +478,8 @@ public final class FieldInfo {
     return vectorDimension;
   }
 
-  /** Returns {@link VectorValues.SimilarityFunction} for the field */
-  public VectorValues.SimilarityFunction getVectorSimilarityFunction() {
+  /** Returns {@link VectorSimilarityFunction} for the field */
+  public VectorSimilarityFunction getVectorSimilarityFunction() {
     return vectorSimilarityFunction;
   }
 
diff --git a/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java b/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java
index 0c8d4e5..79f85ba 100644
--- a/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java
+++ b/lucene/core/src/java/org/apache/lucene/index/FieldInfos.java
@@ -299,9 +299,9 @@ public class FieldInfos implements Iterable<FieldInfo> {
 
   static final class FieldVectorProperties {
     final int numDimensions;
-    final VectorValues.SimilarityFunction similarityFunction;
+    final VectorSimilarityFunction similarityFunction;
 
-    FieldVectorProperties(int numDimensions, VectorValues.SimilarityFunction similarityFunction) {
+    FieldVectorProperties(int numDimensions, VectorSimilarityFunction similarityFunction) {
       this.numDimensions = numDimensions;
       this.similarityFunction = similarityFunction;
     }
@@ -486,7 +486,7 @@ public class FieldInfos implements Iterable<FieldInfo> {
                   0,
                   0,
                   0,
-                  VectorValues.SimilarityFunction.NONE,
+                  VectorSimilarityFunction.NONE,
                   (softDeletesFieldName != null && softDeletesFieldName.equals(fieldName)));
           addOrGet(fi);
         }
@@ -567,7 +567,7 @@ public class FieldInfos implements Iterable<FieldInfo> {
           0,
           0,
           0,
-          VectorValues.SimilarityFunction.NONE,
+          VectorSimilarityFunction.NONE,
           isSoftDeletesField);
     }
 
diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexableFieldType.java b/lucene/core/src/java/org/apache/lucene/index/IndexableFieldType.java
index c9e373d..ec95aef 100644
--- a/lucene/core/src/java/org/apache/lucene/index/IndexableFieldType.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexableFieldType.java
@@ -101,8 +101,8 @@ public interface IndexableFieldType {
   /** The number of dimensions of the field's vector value */
   int vectorDimension();
 
-  /** The {@link VectorValues.SimilarityFunction} of the field's vector value */
-  VectorValues.SimilarityFunction vectorSimilarityFunction();
+  /** The {@link VectorSimilarityFunction} of the field's vector value */
+  VectorSimilarityFunction vectorSimilarityFunction();
 
   /**
    * Attributes for the field type.
diff --git a/lucene/core/src/java/org/apache/lucene/index/IndexingChain.java b/lucene/core/src/java/org/apache/lucene/index/IndexingChain.java
index c6ac695..2cca77a 100644
--- a/lucene/core/src/java/org/apache/lucene/index/IndexingChain.java
+++ b/lucene/core/src/java/org/apache/lucene/index/IndexingChain.java
@@ -1327,8 +1327,7 @@ final class IndexingChain implements Accountable {
     private int pointIndexDimensionCount = 0;
     private int pointNumBytes = 0;
     private int vectorDimension = 0;
-    private VectorValues.SimilarityFunction vectorSimilarityFunction =
-        VectorValues.SimilarityFunction.NONE;
+    private VectorSimilarityFunction vectorSimilarityFunction = VectorSimilarityFunction.NONE;
 
     private static String errMsg =
         "Inconsistency of field data structures across documents for field ";
@@ -1383,8 +1382,8 @@ final class IndexingChain implements Accountable {
       }
     }
 
-    void setVectors(VectorValues.SimilarityFunction similarityFunction, int dimension) {
-      if (vectorSimilarityFunction == VectorValues.SimilarityFunction.NONE) {
+    void setVectors(VectorSimilarityFunction similarityFunction, int dimension) {
+      if (vectorSimilarityFunction == VectorSimilarityFunction.NONE) {
         this.vectorDimension = dimension;
         this.vectorSimilarityFunction = similarityFunction;
       } else {
@@ -1403,7 +1402,7 @@ final class IndexingChain implements Accountable {
       pointIndexDimensionCount = 0;
       pointNumBytes = 0;
       vectorDimension = 0;
-      vectorSimilarityFunction = VectorValues.SimilarityFunction.NONE;
+      vectorSimilarityFunction = VectorSimilarityFunction.NONE;
     }
 
     void assertSameSchema(FieldInfo fi) {
diff --git a/lucene/core/src/java/org/apache/lucene/index/RandomAccessVectorValues.java b/lucene/core/src/java/org/apache/lucene/index/RandomAccessVectorValues.java
index 562272f..3f4ee0c 100644
--- a/lucene/core/src/java/org/apache/lucene/index/RandomAccessVectorValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/RandomAccessVectorValues.java
@@ -33,9 +33,6 @@ public interface RandomAccessVectorValues {
   /** Return the dimension of the returned vector values */
   int dimension();
 
-  /** Return the similarity function used to compare these vectors */
-  VectorValues.SimilarityFunction similarityFunction();
-
   /**
    * Return the vector value indexed at the given ordinal. The provided floating point array may be
    * shared and overwritten by subsequent calls to this method and {@link #binaryValue(int)}.
diff --git a/lucene/core/src/java/org/apache/lucene/index/VectorSimilarityFunction.java b/lucene/core/src/java/org/apache/lucene/index/VectorSimilarityFunction.java
new file mode 100644
index 0000000..5e67a37
--- /dev/null
+++ b/lucene/core/src/java/org/apache/lucene/index/VectorSimilarityFunction.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.lucene.index;
+
+import static org.apache.lucene.util.VectorUtil.dotProduct;
+import static org.apache.lucene.util.VectorUtil.squareDistance;
+
+import org.apache.lucene.codecs.VectorReader;
+
+/**
+ * Vector similarity function; used in search to return top K most similar vectors to a target
+ * vector. This is a label describing the method used during indexing and searching of the vectors
+ * in order to determine the nearest neighbors.
+ */
+public enum VectorSimilarityFunction {
+
+  /**
+   * No similarity function is provided. Note: {@link VectorReader#search(String, float[], int)} is
+   * not supported for fields specifying this.
+   */
+  NONE,
+
+  /** HNSW graph built using Euclidean distance */
+  EUCLIDEAN(true),
+
+  /** HNSW graph buit using dot product */
+  DOT_PRODUCT;
+
+  /**
+   * If true, the scores associated with vector comparisons are in reverse order; that is, lower
+   * scores represent more similar vectors. Otherwise, if false, higher scores represent more
+   * similar vectors.
+   */
+  public final boolean reversed;
+
+  VectorSimilarityFunction(boolean reversed) {
+    this.reversed = reversed;
+  }
+
+  VectorSimilarityFunction() {
+    reversed = false;
+  }
+
+  /**
+   * Calculates a similarity score between the two vectors with a specified function.
+   *
+   * @param v1 a vector
+   * @param v2 another vector, of the same dimension
+   * @return the value of the similarity function applied to the two vectors
+   */
+  public float compare(float[] v1, float[] v2) {
+    switch (this) {
+      case EUCLIDEAN:
+        return squareDistance(v1, v2);
+      case DOT_PRODUCT:
+        return dotProduct(v1, v2);
+      case NONE:
+      default:
+        throw new IllegalStateException("Incomparable similarity function: " + this);
+    }
+  }
+}
diff --git a/lucene/core/src/java/org/apache/lucene/index/VectorValues.java b/lucene/core/src/java/org/apache/lucene/index/VectorValues.java
index ee5f763..77f7d27 100644
--- a/lucene/core/src/java/org/apache/lucene/index/VectorValues.java
+++ b/lucene/core/src/java/org/apache/lucene/index/VectorValues.java
@@ -16,11 +16,7 @@
  */
 package org.apache.lucene.index;
 
-import static org.apache.lucene.util.VectorUtil.dotProduct;
-import static org.apache.lucene.util.VectorUtil.squareDistance;
-
 import java.io.IOException;
-import org.apache.lucene.codecs.VectorReader;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.util.BytesRef;
 
@@ -50,9 +46,6 @@ public abstract class VectorValues extends DocIdSetIterator {
    */
   public abstract int size();
 
-  /** Return the similarity function used to compare these vectors */
-  public abstract SimilarityFunction similarityFunction();
-
   /**
    * Return the vector value for the current document ID. It is illegal to call this method when the
    * iterator is not positioned: before advancing, or after failing to advance. The returned array
@@ -75,60 +68,6 @@ public abstract class VectorValues extends DocIdSetIterator {
   }
 
   /**
-   * Vector similarity function; used in search to return top K most similar vectors to a target
-   * vector. This is a label describing the method used during indexing and searching of the vectors
-   * in order to determine the nearest neighbors.
-   */
-  public enum SimilarityFunction {
-
-    /**
-     * No similarity function is provided. Note: {@link VectorReader#search(String, float[], int)}
-     * is not supported for fields specifying this.
-     */
-    NONE,
-
-    /** HNSW graph built using Euclidean distance */
-    EUCLIDEAN(true),
-
-    /** HNSW graph buit using dot product */
-    DOT_PRODUCT;
-
-    /**
-     * If true, the scores associated with vector comparisons are in reverse order; that is, lower
-     * scores represent more similar vectors. Otherwise, if false, higher scores represent more
-     * similar vectors.
-     */
-    public final boolean reversed;
-
-    SimilarityFunction(boolean reversed) {
-      this.reversed = reversed;
-    }
-
-    SimilarityFunction() {
-      reversed = false;
-    }
-
-    /**
-     * Calculates a similarity score between the two vectors with a specified function.
-     *
-     * @param v1 a vector
-     * @param v2 another vector, of the same dimension
-     * @return the value of the similarity function applied to the two vectors
-     */
-    public float compare(float[] v1, float[] v2) {
-      switch (this) {
-        case EUCLIDEAN:
-          return squareDistance(v1, v2);
-        case DOT_PRODUCT:
-          return dotProduct(v1, v2);
-        case NONE:
-        default:
-          throw new IllegalStateException("Incomparable similarity function: " + this);
-      }
-    }
-  }
-
-  /**
    * Represents the lack of vector values. It is returned by providers that do not support
    * VectorValues.
    */
@@ -146,11 +85,6 @@ public abstract class VectorValues extends DocIdSetIterator {
         }
 
         @Override
-        public SimilarityFunction similarityFunction() {
-          return SimilarityFunction.NONE;
-        }
-
-        @Override
         public float[] vectorValue() {
           throw new IllegalStateException(
               "Attempt to get vectors from EMPTY values (which was not advanced)");
diff --git a/lucene/core/src/java/org/apache/lucene/index/VectorValuesWriter.java b/lucene/core/src/java/org/apache/lucene/index/VectorValuesWriter.java
index 13e9b3d..f8b08fa 100644
--- a/lucene/core/src/java/org/apache/lucene/index/VectorValuesWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/index/VectorValuesWriter.java
@@ -108,11 +108,7 @@ class VectorValuesWriter {
    */
   public void flush(Sorter.DocMap sortMap, VectorWriter vectorWriter) throws IOException {
     VectorValues vectorValues =
-        new BufferedVectorValues(
-            docsWithField,
-            vectors,
-            fieldInfo.getVectorDimension(),
-            fieldInfo.getVectorSimilarityFunction());
+        new BufferedVectorValues(docsWithField, vectors, fieldInfo.getVectorDimension());
     if (sortMap != null) {
       vectorWriter.writeField(fieldInfo, new SortingVectorValues(vectorValues, sortMap));
     } else {
@@ -190,11 +186,6 @@ class VectorValuesWriter {
     }
 
     @Override
-    public SimilarityFunction similarityFunction() {
-      return delegate.similarityFunction();
-    }
-
-    @Override
     public int advance(int target) throws IOException {
       throw new UnsupportedOperationException();
     }
@@ -224,11 +215,6 @@ class VectorValuesWriter {
         }
 
         @Override
-        public SimilarityFunction similarityFunction() {
-          return delegateRA.similarityFunction();
-        }
-
-        @Override
         public float[] vectorValue(int targetOrd) throws IOException {
           return delegateRA.vectorValue(ordMap[targetOrd]);
         }
@@ -248,7 +234,6 @@ class VectorValuesWriter {
 
     // These are always the vectors of a VectorValuesWriter, which are copied when added to it
     final List<float[]> vectors;
-    final SimilarityFunction similarityFunction;
     final int dimension;
 
     final ByteBuffer buffer;
@@ -259,15 +244,10 @@ class VectorValuesWriter {
     DocIdSetIterator docsWithFieldIter;
     int ord = -1;
 
-    BufferedVectorValues(
-        DocsWithFieldSet docsWithField,
-        List<float[]> vectors,
-        int dimension,
-        SimilarityFunction similarityFunction) {
+    BufferedVectorValues(DocsWithFieldSet docsWithField, List<float[]> vectors, int dimension) {
       this.docsWithField = docsWithField;
       this.vectors = vectors;
       this.dimension = dimension;
-      this.similarityFunction = similarityFunction;
       buffer = ByteBuffer.allocate(dimension * Float.BYTES).order(ByteOrder.LITTLE_ENDIAN);
       binaryValue = new BytesRef(buffer.array());
       raBuffer = ByteBuffer.allocate(dimension * Float.BYTES).order(ByteOrder.LITTLE_ENDIAN);
@@ -277,7 +257,7 @@ class VectorValuesWriter {
 
     @Override
     public RandomAccessVectorValues randomAccess() {
-      return new BufferedVectorValues(docsWithField, vectors, dimension, similarityFunction);
+      return new BufferedVectorValues(docsWithField, vectors, dimension);
     }
 
     @Override
@@ -291,11 +271,6 @@ class VectorValuesWriter {
     }
 
     @Override
-    public SimilarityFunction similarityFunction() {
-      return similarityFunction;
-    }
-
-    @Override
     public BytesRef binaryValue() {
       buffer.asFloatBuffer().put(vectorValue());
       return binaryValue;
diff --git a/lucene/core/src/java/org/apache/lucene/util/hnsw/HnswGraph.java b/lucene/core/src/java/org/apache/lucene/util/hnsw/HnswGraph.java
index 6fb7caa..49f2c95 100644
--- a/lucene/core/src/java/org/apache/lucene/util/hnsw/HnswGraph.java
+++ b/lucene/core/src/java/org/apache/lucene/util/hnsw/HnswGraph.java
@@ -25,7 +25,7 @@ import java.util.List;
 import java.util.Random;
 import org.apache.lucene.index.KnnGraphValues;
 import org.apache.lucene.index.RandomAccessVectorValues;
-import org.apache.lucene.index.VectorValues;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.util.SparseFixedBitSet;
 
 /**
@@ -91,10 +91,10 @@ public final class HnswGraph extends KnnGraphValues {
       int topK,
       int numSeed,
       RandomAccessVectorValues vectors,
+      VectorSimilarityFunction similarityFunction,
       KnnGraphValues graphValues,
       Random random)
       throws IOException {
-    VectorValues.SimilarityFunction similarityFunction = vectors.similarityFunction();
     int size = graphValues.size();
 
     // MIN heap, holding the top results
diff --git a/lucene/core/src/java/org/apache/lucene/util/hnsw/HnswGraphBuilder.java b/lucene/core/src/java/org/apache/lucene/util/hnsw/HnswGraphBuilder.java
index 16d4fc6..b99cb02 100644
--- a/lucene/core/src/java/org/apache/lucene/util/hnsw/HnswGraphBuilder.java
+++ b/lucene/core/src/java/org/apache/lucene/util/hnsw/HnswGraphBuilder.java
@@ -22,7 +22,7 @@ import java.util.Locale;
 import java.util.Random;
 import org.apache.lucene.index.RandomAccessVectorValues;
 import org.apache.lucene.index.RandomAccessVectorValuesProducer;
-import org.apache.lucene.index.VectorValues;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.util.InfoStream;
 
 /**
@@ -42,7 +42,7 @@ public final class HnswGraphBuilder {
   private final int beamWidth;
   private final NeighborArray scratch;
 
-  private final VectorValues.SimilarityFunction similarityFunction;
+  private final VectorSimilarityFunction similarityFunction;
   private final RandomAccessVectorValues vectorValues;
   private final Random random;
   private final BoundsChecker bound;
@@ -67,11 +67,15 @@ public final class HnswGraphBuilder {
    *     to ensure repeatable construction.
    */
   public HnswGraphBuilder(
-      RandomAccessVectorValuesProducer vectors, int maxConn, int beamWidth, long seed) {
+      RandomAccessVectorValuesProducer vectors,
+      VectorSimilarityFunction similarityFunction,
+      int maxConn,
+      int beamWidth,
+      long seed) {
     vectorValues = vectors.randomAccess();
     buildVectors = vectors.randomAccess();
-    similarityFunction = vectorValues.similarityFunction();
-    if (similarityFunction == VectorValues.SimilarityFunction.NONE) {
+    this.similarityFunction = similarityFunction;
+    if (similarityFunction == VectorSimilarityFunction.NONE) {
       throw new IllegalStateException("No distance function");
     }
     if (maxConn <= 0) {
@@ -133,7 +137,8 @@ public final class HnswGraphBuilder {
   /** Inserts a doc with vector value to the graph */
   void addGraphNode(float[] value) throws IOException {
     NeighborQueue candidates =
-        HnswGraph.search(value, beamWidth, beamWidth, vectorValues, hnsw, random);
+        HnswGraph.search(
+            value, beamWidth, beamWidth, vectorValues, similarityFunction, hnsw, random);
 
     int node = hnsw.addNode();
 
diff --git a/lucene/core/src/test/org/apache/lucene/document/TestPerFieldConsistency.java b/lucene/core/src/test/org/apache/lucene/document/TestPerFieldConsistency.java
index 98878da..140e42a 100644
--- a/lucene/core/src/test/org/apache/lucene/document/TestPerFieldConsistency.java
+++ b/lucene/core/src/test/org/apache/lucene/document/TestPerFieldConsistency.java
@@ -32,7 +32,7 @@ import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexWriterConfig;
 import org.apache.lucene.index.NoMergePolicy;
-import org.apache.lucene.index.VectorValues;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.LuceneTestCase;
@@ -88,10 +88,10 @@ public class TestPerFieldConsistency extends LuceneTestCase {
   }
 
   private static Field randomVectorField(Random random, String fieldName) {
-    VectorValues.SimilarityFunction similarityFunction =
-        RandomPicks.randomFrom(random, VectorValues.SimilarityFunction.values());
-    while (similarityFunction == VectorValues.SimilarityFunction.NONE) {
-      similarityFunction = RandomPicks.randomFrom(random, VectorValues.SimilarityFunction.values());
+    VectorSimilarityFunction similarityFunction =
+        RandomPicks.randomFrom(random, VectorSimilarityFunction.values());
+    while (similarityFunction == VectorSimilarityFunction.NONE) {
+      similarityFunction = RandomPicks.randomFrom(random, VectorSimilarityFunction.values());
     }
     float[] values = new float[randomIntBetween(1, 10)];
     for (int i = 0; i < values.length; i++) {
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestCodecs.java b/lucene/core/src/test/org/apache/lucene/index/TestCodecs.java
index b8f7e06..2b7c06f 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestCodecs.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestCodecs.java
@@ -112,7 +112,7 @@ public class TestCodecs extends LuceneTestCase {
                     0,
                     0,
                     0,
-                    VectorValues.SimilarityFunction.NONE,
+                    VectorSimilarityFunction.NONE,
                     false));
       }
       this.terms = terms;
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestDocumentWriter.java b/lucene/core/src/test/org/apache/lucene/index/TestDocumentWriter.java
index 991e6bb..045f3cd 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestDocumentWriter.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestDocumentWriter.java
@@ -381,7 +381,6 @@ public class TestDocumentWriter extends LuceneTestCase {
   public void testRAMUsageVector() throws IOException {
     doTestRAMUsage(
         field ->
-            new VectorField(
-                field, new float[] {1, 2, 3, 4}, VectorValues.SimilarityFunction.EUCLIDEAN));
+            new VectorField(field, new float[] {1, 2, 3, 4}, VectorSimilarityFunction.EUCLIDEAN));
   }
 }
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestFieldInfos.java b/lucene/core/src/test/org/apache/lucene/index/TestFieldInfos.java
index 3baa564..5c3a122 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestFieldInfos.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestFieldInfos.java
@@ -260,7 +260,7 @@ public class TestFieldInfos extends LuceneTestCase {
               0,
               0,
               0,
-              VectorValues.SimilarityFunction.NONE,
+              VectorSimilarityFunction.NONE,
               false));
     }
     int idx =
@@ -279,7 +279,7 @@ public class TestFieldInfos extends LuceneTestCase {
                 0,
                 0,
                 0,
-                VectorValues.SimilarityFunction.NONE,
+                VectorSimilarityFunction.NONE,
                 false));
     assertEquals("Field numbers 0 through 9 were allocated", 10, idx);
 
@@ -300,7 +300,7 @@ public class TestFieldInfos extends LuceneTestCase {
                 0,
                 0,
                 0,
-                VectorValues.SimilarityFunction.NONE,
+                VectorSimilarityFunction.NONE,
                 false));
     assertEquals("Field numbers should reset after clear()", 0, idx);
   }
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestFieldsReader.java b/lucene/core/src/test/org/apache/lucene/index/TestFieldsReader.java
index 3563929..04ee1a1 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestFieldsReader.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestFieldsReader.java
@@ -63,7 +63,7 @@ public class TestFieldsReader extends LuceneTestCase {
               0,
               0,
               0,
-              VectorValues.SimilarityFunction.NONE,
+              VectorSimilarityFunction.NONE,
               field.name().equals(softDeletesFieldName)));
     }
     dir = newDirectory();
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexableField.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexableField.java
index 543e808..b68b0b3 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexableField.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexableField.java
@@ -113,8 +113,8 @@ public class TestIndexableField extends LuceneTestCase {
           }
 
           @Override
-          public VectorValues.SimilarityFunction vectorSimilarityFunction() {
-            return VectorValues.SimilarityFunction.NONE;
+          public VectorSimilarityFunction vectorSimilarityFunction() {
+            return VectorSimilarityFunction.NONE;
           }
 
           @Override
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestKnnGraph.java b/lucene/core/src/test/org/apache/lucene/index/TestKnnGraph.java
index 1875bd8..98b3652 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestKnnGraph.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestKnnGraph.java
@@ -38,7 +38,6 @@ import org.apache.lucene.document.FieldType;
 import org.apache.lucene.document.SortedDocValuesField;
 import org.apache.lucene.document.StringField;
 import org.apache.lucene.document.VectorField;
-import org.apache.lucene.index.VectorValues.SimilarityFunction;
 import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.store.Directory;
@@ -58,7 +57,7 @@ public class TestKnnGraph extends LuceneTestCase {
   private static int maxConn = Lucene90HnswVectorFormat.DEFAULT_MAX_CONN;
 
   private Codec codec;
-  private SimilarityFunction similarityFunction;
+  private VectorSimilarityFunction similarityFunction;
 
   @Before
   public void setup() {
@@ -76,8 +75,8 @@ public class TestKnnGraph extends LuceneTestCase {
           }
         };
 
-    int similarity = random().nextInt(SimilarityFunction.values().length - 1) + 1;
-    similarityFunction = SimilarityFunction.values()[similarity];
+    int similarity = random().nextInt(VectorSimilarityFunction.values().length - 1) + 1;
+    similarityFunction = VectorSimilarityFunction.values()[similarity];
   }
 
   @After
@@ -227,7 +226,7 @@ public class TestKnnGraph extends LuceneTestCase {
   /** Verify that searching does something reasonable */
   public void testSearch() throws Exception {
     // We can't use dot product here since the vectors are laid out on a grid, not a sphere.
-    similarityFunction = SimilarityFunction.EUCLIDEAN;
+    similarityFunction = VectorSimilarityFunction.EUCLIDEAN;
     IndexWriterConfig config = newIndexWriterConfig();
     config.setCodec(codec); // test is not compatible with simpletext
     try (Directory dir = newDirectory();
@@ -454,7 +453,8 @@ public class TestKnnGraph extends LuceneTestCase {
     add(iw, id, vector, similarityFunction);
   }
 
-  private void add(IndexWriter iw, int id, float[] vector, SimilarityFunction similarityFunction)
+  private void add(
+      IndexWriter iw, int id, float[] vector, VectorSimilarityFunction similarityFunction)
       throws IOException {
     Document doc = new Document();
     if (vector != null) {
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestPendingSoftDeletes.java b/lucene/core/src/test/org/apache/lucene/index/TestPendingSoftDeletes.java
index 62420ba..bd6e438 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestPendingSoftDeletes.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestPendingSoftDeletes.java
@@ -17,7 +17,7 @@
 
 package org.apache.lucene.index;
 
-import static org.apache.lucene.index.VectorValues.SimilarityFunction.NONE;
+import static org.apache.lucene.index.VectorSimilarityFunction.NONE;
 
 import java.io.IOException;
 import java.util.Arrays;
diff --git a/lucene/core/src/test/org/apache/lucene/util/hnsw/KnnGraphTester.java b/lucene/core/src/test/org/apache/lucene/util/hnsw/KnnGraphTester.java
index ed91db2..34eec1c 100644
--- a/lucene/core/src/test/org/apache/lucene/util/hnsw/KnnGraphTester.java
+++ b/lucene/core/src/test/org/apache/lucene/util/hnsw/KnnGraphTester.java
@@ -53,7 +53,7 @@ import org.apache.lucene.index.LeafReader;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.RandomAccessVectorValues;
 import org.apache.lucene.index.RandomAccessVectorValuesProducer;
-import org.apache.lucene.index.VectorValues;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.store.Directory;
@@ -73,8 +73,8 @@ public class KnnGraphTester {
 
   private static final String KNN_FIELD = "knn";
   private static final String ID_FIELD = "id";
-  private static final VectorValues.SimilarityFunction SIMILARITY_FUNCTION =
-      VectorValues.SimilarityFunction.DOT_PRODUCT;
+  private static final VectorSimilarityFunction SIMILARITY_FUNCTION =
+      VectorSimilarityFunction.DOT_PRODUCT;
 
   private int numDocs;
   private int dim;
@@ -251,7 +251,8 @@ public class KnnGraphTester {
   private void dumpGraph(Path docsPath) throws IOException {
     try (BinaryFileVectors vectors = new BinaryFileVectors(docsPath)) {
       RandomAccessVectorValues values = vectors.randomAccess();
-      HnswGraphBuilder builder = new HnswGraphBuilder(vectors, maxConn, beamWidth, 0);
+      HnswGraphBuilder builder =
+          new HnswGraphBuilder(vectors, SIMILARITY_FUNCTION, maxConn, beamWidth, 0);
       // start at node 1
       for (int i = 1; i < numDocs; i++) {
         builder.addGraphNode(values.vectorValue(i));
@@ -580,8 +581,7 @@ public class KnnGraphTester {
     iwc.setRAMBufferSizeMB(1994d);
     // iwc.setMaxBufferedDocs(10000);
 
-    FieldType fieldType =
-        VectorField.createFieldType(dim, VectorValues.SimilarityFunction.DOT_PRODUCT);
+    FieldType fieldType = VectorField.createFieldType(dim, VectorSimilarityFunction.DOT_PRODUCT);
     if (quiet == false) {
       iwc.setInfoStream(new PrintStreamInfoStream(System.out));
       System.out.println("creating index in " + indexPath);
@@ -676,11 +676,6 @@ public class KnnGraphTester {
       }
 
       @Override
-      public VectorValues.SimilarityFunction similarityFunction() {
-        return SIMILARITY_FUNCTION;
-      }
-
-      @Override
       public float[] vectorValue(int targetOrd) {
         int pos = targetOrd * dim;
         source.position(pos);
diff --git a/lucene/core/src/test/org/apache/lucene/util/hnsw/MockVectorValues.java b/lucene/core/src/test/org/apache/lucene/util/hnsw/MockVectorValues.java
index c4aa885..ee52a11 100644
--- a/lucene/core/src/test/org/apache/lucene/util/hnsw/MockVectorValues.java
+++ b/lucene/core/src/test/org/apache/lucene/util/hnsw/MockVectorValues.java
@@ -30,13 +30,11 @@ class MockVectorValues extends VectorValues
   protected final int dimension;
   protected final float[][] denseValues;
   protected final float[][] values;
-  protected final SimilarityFunction similarityFunction;
   private final int numVectors;
 
   private int pos = -1;
 
-  MockVectorValues(SimilarityFunction similarityFunction, float[][] values) {
-    this.similarityFunction = similarityFunction;
+  MockVectorValues(float[][] values) {
     this.dimension = values[0].length;
     this.values = values;
     int maxDoc = values.length;
@@ -52,7 +50,7 @@ class MockVectorValues extends VectorValues
   }
 
   public MockVectorValues copy() {
-    return new MockVectorValues(similarityFunction, values);
+    return new MockVectorValues(values);
   }
 
   @Override
@@ -61,11 +59,6 @@ class MockVectorValues extends VectorValues
   }
 
   @Override
-  public SimilarityFunction similarityFunction() {
-    return similarityFunction;
-  }
-
-  @Override
   public int dimension() {
     return dimension;
   }
diff --git a/lucene/core/src/test/org/apache/lucene/util/hnsw/TestHnsw.java b/lucene/core/src/test/org/apache/lucene/util/hnsw/TestHnsw.java
index 7a1d6ca..bb3deae 100644
--- a/lucene/core/src/test/org/apache/lucene/util/hnsw/TestHnsw.java
+++ b/lucene/core/src/test/org/apache/lucene/util/hnsw/TestHnsw.java
@@ -41,6 +41,7 @@ import org.apache.lucene.index.KnnGraphValues;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.RandomAccessVectorValues;
 import org.apache.lucene.index.RandomAccessVectorValuesProducer;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.index.VectorValues;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.ArrayUtil;
@@ -61,7 +62,11 @@ public class TestHnsw extends LuceneTestCase {
     int maxConn = random().nextInt(10) + 5;
     int beamWidth = random().nextInt(10) + 5;
     long seed = random().nextLong();
-    HnswGraphBuilder builder = new HnswGraphBuilder(vectors, maxConn, beamWidth, seed);
+    VectorSimilarityFunction similarityFunction =
+        VectorSimilarityFunction.values()[
+            random().nextInt(VectorSimilarityFunction.values().length - 1) + 1];
+    HnswGraphBuilder builder =
+        new HnswGraphBuilder(vectors, similarityFunction, maxConn, beamWidth, seed);
     HnswGraph hnsw = builder.build(vectors);
 
     // Recreate the graph while indexing with the same random seed and write it out
@@ -87,7 +92,7 @@ public class TestHnsw extends LuceneTestCase {
             indexedDoc++;
           }
           Document doc = new Document();
-          doc.add(new VectorField("field", v2.vectorValue(), v2.similarityFunction));
+          doc.add(new VectorField("field", v2.vectorValue()));
           doc.add(new StoredField("id", v2.docID()));
           iw.addDocument(doc);
           nVec++;
@@ -97,7 +102,6 @@ public class TestHnsw extends LuceneTestCase {
       try (IndexReader reader = DirectoryReader.open(dir)) {
         for (LeafReaderContext ctx : reader.leaves()) {
           VectorValues values = ctx.reader().getVectorValues("field");
-          assertEquals(vectors.similarityFunction, values.similarityFunction());
           assertEquals(dim, values.dimension());
           assertEquals(nVec, values.size());
           assertEquals(indexedDoc, ctx.reader().maxDoc());
@@ -121,11 +125,20 @@ public class TestHnsw extends LuceneTestCase {
   public void testAknnDiverse() throws IOException {
     int nDoc = 100;
     CircularVectorValues vectors = new CircularVectorValues(nDoc);
-    HnswGraphBuilder builder = new HnswGraphBuilder(vectors, 16, 100, random().nextInt());
+    HnswGraphBuilder builder =
+        new HnswGraphBuilder(
+            vectors, VectorSimilarityFunction.DOT_PRODUCT, 16, 100, random().nextInt());
     HnswGraph hnsw = builder.build(vectors);
     // run some searches
     NeighborQueue nn =
-        HnswGraph.search(new float[] {1, 0}, 10, 5, vectors.randomAccess(), hnsw, random());
+        HnswGraph.search(
+            new float[] {1, 0},
+            10,
+            5,
+            vectors.randomAccess(),
+            VectorSimilarityFunction.DOT_PRODUCT,
+            hnsw,
+            random());
     int sum = 0;
     for (int node : nn.nodes()) {
       sum += node;
@@ -168,20 +181,31 @@ public class TestHnsw extends LuceneTestCase {
   }
 
   public void testHnswGraphBuilderInvalid() {
-    expectThrows(NullPointerException.class, () -> new HnswGraphBuilder(null, 0, 0, 0));
+    expectThrows(NullPointerException.class, () -> new HnswGraphBuilder(null, null, 0, 0, 0));
     expectThrows(
         IllegalArgumentException.class,
-        () -> new HnswGraphBuilder(new RandomVectorValues(1, 1, random()), 0, 10, 0));
+        () ->
+            new HnswGraphBuilder(
+                new RandomVectorValues(1, 1, random()),
+                VectorSimilarityFunction.EUCLIDEAN,
+                0,
+                10,
+                0));
     expectThrows(
         IllegalArgumentException.class,
-        () -> new HnswGraphBuilder(new RandomVectorValues(1, 1, random()), 10, 0, 0));
+        () ->
+            new HnswGraphBuilder(
+                new RandomVectorValues(1, 1, random()),
+                VectorSimilarityFunction.EUCLIDEAN,
+                10,
+                0,
+                0));
   }
 
   public void testDiversity() throws IOException {
     // Some carefully checked test cases with simple 2d vectors on the unit circle:
     MockVectorValues vectors =
         new MockVectorValues(
-            VectorValues.SimilarityFunction.DOT_PRODUCT,
             new float[][] {
               unitVector2d(0.5),
               unitVector2d(0.75),
@@ -191,7 +215,9 @@ public class TestHnsw extends LuceneTestCase {
               unitVector2d(0.77),
             });
     // First add nodes until everybody gets a full neighbor list
-    HnswGraphBuilder builder = new HnswGraphBuilder(vectors, 2, 10, random().nextInt());
+    HnswGraphBuilder builder =
+        new HnswGraphBuilder(
+            vectors, VectorSimilarityFunction.DOT_PRODUCT, 2, 10, random().nextInt());
     // node 0 is added by the builder constructor
     // builder.addGraphNode(vectors.vectorValue(0));
     builder.addGraphNode(vectors.vectorValue(1));
@@ -247,18 +273,22 @@ public class TestHnsw extends LuceneTestCase {
     int dim = atLeast(10);
     int topK = 5;
     RandomVectorValues vectors = new RandomVectorValues(size, dim, random());
-    HnswGraphBuilder builder = new HnswGraphBuilder(vectors, 10, 30, random().nextLong());
+    VectorSimilarityFunction similarityFunction =
+        VectorSimilarityFunction.values()[
+            random().nextInt(VectorSimilarityFunction.values().length - 1) + 1];
+    HnswGraphBuilder builder =
+        new HnswGraphBuilder(vectors, similarityFunction, 10, 30, random().nextLong());
     HnswGraph hnsw = builder.build(vectors);
     int totalMatches = 0;
     for (int i = 0; i < 100; i++) {
       float[] query = randomVector(random(), dim);
-      NeighborQueue actual = HnswGraph.search(query, topK, 100, vectors, hnsw, random());
-      NeighborQueue expected = new NeighborQueue(topK, vectors.similarityFunction.reversed);
+      NeighborQueue actual =
+          HnswGraph.search(query, topK, 100, vectors, similarityFunction, hnsw, random());
+      NeighborQueue expected = new NeighborQueue(topK, similarityFunction.reversed);
       for (int j = 0; j < size; j++) {
         float[] v = vectors.vectorValue(j);
         if (v != null) {
-          expected.insertWithOverflow(
-              j, vectors.similarityFunction.compare(query, vectors.vectorValue(j)));
+          expected.insertWithOverflow(j, similarityFunction.compare(query, vectors.vectorValue(j)));
         }
       }
       assertEquals(topK, actual.size());
@@ -305,11 +335,6 @@ public class TestHnsw extends LuceneTestCase {
     }
 
     @Override
-    public SimilarityFunction similarityFunction() {
-      return SimilarityFunction.DOT_PRODUCT;
-    }
-
-    @Override
     public int dimension() {
       return 2;
     }
@@ -409,13 +434,11 @@ public class TestHnsw extends LuceneTestCase {
   static class RandomVectorValues extends MockVectorValues {
 
     RandomVectorValues(int size, int dimension, Random random) {
-      super(
-          SimilarityFunction.values()[random.nextInt(SimilarityFunction.values().length - 1) + 1],
-          createRandomVectors(size, dimension, random));
+      super(createRandomVectors(size, dimension, random));
     }
 
     RandomVectorValues(RandomVectorValues other) {
-      super(other.similarityFunction, other.values);
+      super(other.values);
     }
 
     @Override
diff --git a/lucene/highlighter/src/java/org/apache/lucene/search/highlight/TermVectorLeafReader.java b/lucene/highlighter/src/java/org/apache/lucene/search/highlight/TermVectorLeafReader.java
index a6f68cb..34916cc 100644
--- a/lucene/highlighter/src/java/org/apache/lucene/search/highlight/TermVectorLeafReader.java
+++ b/lucene/highlighter/src/java/org/apache/lucene/search/highlight/TermVectorLeafReader.java
@@ -35,6 +35,7 @@ import org.apache.lucene.index.SortedSetDocValues;
 import org.apache.lucene.index.StoredFieldVisitor;
 import org.apache.lucene.index.TermVectors;
 import org.apache.lucene.index.Terms;
+import org.apache.lucene.index.VectorSimilarityFunction;
 import org.apache.lucene.index.VectorValues;
 import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.util.Bits;
@@ -97,7 +98,7 @@ public class TermVectorLeafReader extends LeafReader {
             0,
             0,
             0,
-            VectorValues.SimilarityFunction.NONE,
+            VectorSimilarityFunction.NONE,
             false);
     fieldInfos = new FieldInfos(new FieldInfo[] {fieldInfo});
   }
diff --git a/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingVectorFormat.java b/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingVectorFormat.java
index 4781b64..760f1e6 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingVectorFormat.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingVectorFormat.java
@@ -93,7 +93,6 @@ public class AssertingVectorFormat extends VectorFormat {
         assert values.docID() == -1;
         assert values.size() >= 0;
         assert values.dimension() > 0;
-        assert values.similarityFunction() != null;
       }
       return values;
     }
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/BaseFieldInfoFormatTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/index/BaseFieldInfoFormatTestCase.java
index b17e671..cff939a 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/BaseFieldInfoFormatTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/BaseFieldInfoFormatTestCase.java
@@ -341,8 +341,8 @@ public abstract class BaseFieldInfoFormatTestCase extends BaseIndexFileFormatTes
 
     if (r.nextBoolean()) {
       int dimension = 1 + r.nextInt(VectorValues.MAX_DIMENSIONS);
-      VectorValues.SimilarityFunction similarityFunction =
-          RandomPicks.randomFrom(r, VectorValues.SimilarityFunction.values());
+      VectorSimilarityFunction similarityFunction =
+          RandomPicks.randomFrom(r, VectorSimilarityFunction.values());
       type.setVectorDimensionsAndSimilarityFunction(dimension, similarityFunction);
     }
 
@@ -412,7 +412,7 @@ public abstract class BaseFieldInfoFormatTestCase extends BaseIndexFileFormatTes
         0,
         0,
         0,
-        VectorValues.SimilarityFunction.NONE,
+        VectorSimilarityFunction.NONE,
         false);
   }
 }
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/BaseVectorFormatTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/index/BaseVectorFormatTestCase.java
index e1e4a89..2436e90 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/BaseVectorFormatTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/BaseVectorFormatTestCase.java
@@ -49,15 +49,14 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
 
   @Override
   protected void addRandomFields(Document doc) {
-    doc.add(new VectorField("v2", randomVector(30), VectorValues.SimilarityFunction.NONE));
+    doc.add(new VectorField("v2", randomVector(30), VectorSimilarityFunction.NONE));
   }
 
   public void testFieldConstructor() {
     float[] v = new float[1];
     VectorField field = new VectorField("f", v);
     assertEquals(1, field.fieldType().vectorDimension());
-    assertEquals(
-        VectorValues.SimilarityFunction.EUCLIDEAN, field.fieldType().vectorSimilarityFunction());
+    assertEquals(VectorSimilarityFunction.EUCLIDEAN, field.fieldType().vectorSimilarityFunction());
     assertSame(v, field.vectorValue());
   }
 
@@ -66,7 +65,7 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     expectThrows(IllegalArgumentException.class, () -> new VectorField("f", null));
     expectThrows(
         IllegalArgumentException.class,
-        () -> new VectorField("f", new float[1], (VectorValues.SimilarityFunction) null));
+        () -> new VectorField("f", new float[1], (VectorSimilarityFunction) null));
     expectThrows(IllegalArgumentException.class, () -> new VectorField("f", new float[0]));
     expectThrows(
         IllegalArgumentException.class,
@@ -91,11 +90,11 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     try (Directory dir = newDirectory();
         IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
       Document doc = new Document();
-      doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+      doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
       w.addDocument(doc);
 
       Document doc2 = new Document();
-      doc2.add(new VectorField("f", new float[3], VectorValues.SimilarityFunction.DOT_PRODUCT));
+      doc2.add(new VectorField("f", new float[3], VectorSimilarityFunction.DOT_PRODUCT));
       IllegalArgumentException expected =
           expectThrows(IllegalArgumentException.class, () -> w.addDocument(doc2));
       String errMsg =
@@ -107,12 +106,12 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     try (Directory dir = newDirectory();
         IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
       Document doc = new Document();
-      doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+      doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
       w.addDocument(doc);
       w.commit();
 
       Document doc2 = new Document();
-      doc2.add(new VectorField("f", new float[3], VectorValues.SimilarityFunction.DOT_PRODUCT));
+      doc2.add(new VectorField("f", new float[3], VectorSimilarityFunction.DOT_PRODUCT));
       IllegalArgumentException expected =
           expectThrows(IllegalArgumentException.class, () -> w.addDocument(doc2));
       String errMsg =
@@ -127,11 +126,11 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     try (Directory dir = newDirectory();
         IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
       Document doc = new Document();
-      doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+      doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
       w.addDocument(doc);
 
       Document doc2 = new Document();
-      doc2.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.EUCLIDEAN));
+      doc2.add(new VectorField("f", new float[4], VectorSimilarityFunction.EUCLIDEAN));
       IllegalArgumentException expected =
           expectThrows(IllegalArgumentException.class, () -> w.addDocument(doc2));
       String errMsg =
@@ -143,12 +142,12 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     try (Directory dir = newDirectory();
         IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
       Document doc = new Document();
-      doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+      doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
       w.addDocument(doc);
       w.commit();
 
       Document doc2 = new Document();
-      doc2.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.EUCLIDEAN));
+      doc2.add(new VectorField("f", new float[4], VectorSimilarityFunction.EUCLIDEAN));
       IllegalArgumentException expected =
           expectThrows(IllegalArgumentException.class, () -> w.addDocument(doc2));
       String errMsg =
@@ -162,13 +161,13 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     try (Directory dir = newDirectory()) {
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
         w.addDocument(doc);
       }
 
       try (IndexWriter w2 = new IndexWriter(dir, newIndexWriterConfig())) {
         Document doc2 = new Document();
-        doc2.add(new VectorField("f", new float[1], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc2.add(new VectorField("f", new float[1], VectorSimilarityFunction.DOT_PRODUCT));
         IllegalArgumentException expected =
             expectThrows(IllegalArgumentException.class, () -> w2.addDocument(doc2));
         assertEquals(
@@ -183,13 +182,13 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     try (Directory dir = newDirectory()) {
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
         w.addDocument(doc);
       }
 
       try (IndexWriter w2 = new IndexWriter(dir, newIndexWriterConfig())) {
         Document doc2 = new Document();
-        doc2.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.EUCLIDEAN));
+        doc2.add(new VectorField("f", new float[4], VectorSimilarityFunction.EUCLIDEAN));
         IllegalArgumentException expected =
             expectThrows(IllegalArgumentException.class, () -> w2.addDocument(doc2));
         assertEquals(
@@ -203,7 +202,7 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
   public void testAddIndexesDirectory0() throws Exception {
     String fieldName = "field";
     Document doc = new Document();
-    doc.add(new VectorField(fieldName, new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+    doc.add(new VectorField(fieldName, new float[4], VectorSimilarityFunction.DOT_PRODUCT));
     try (Directory dir = newDirectory();
         Directory dir2 = newDirectory()) {
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
@@ -231,8 +230,7 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
         w.addDocument(doc);
       }
-      doc.add(
-          new VectorField(fieldName, new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+      doc.add(new VectorField(fieldName, new float[4], VectorSimilarityFunction.DOT_PRODUCT));
       try (IndexWriter w2 = new IndexWriter(dir2, newIndexWriterConfig())) {
         w2.addDocument(doc);
         w2.addIndexes(dir);
@@ -252,7 +250,7 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     String fieldName = "field";
     float[] vector = new float[1];
     Document doc = new Document();
-    doc.add(new VectorField(fieldName, vector, VectorValues.SimilarityFunction.DOT_PRODUCT));
+    doc.add(new VectorField(fieldName, vector, VectorSimilarityFunction.DOT_PRODUCT));
     try (Directory dir = newDirectory();
         Directory dir2 = newDirectory()) {
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
@@ -283,12 +281,12 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
         Directory dir2 = newDirectory()) {
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
         w.addDocument(doc);
       }
       try (IndexWriter w2 = new IndexWriter(dir2, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[5], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[5], VectorSimilarityFunction.DOT_PRODUCT));
         w2.addDocument(doc);
         IllegalArgumentException expected =
             expectThrows(
@@ -306,12 +304,12 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
         Directory dir2 = newDirectory()) {
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
         w.addDocument(doc);
       }
       try (IndexWriter w2 = new IndexWriter(dir2, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.EUCLIDEAN));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.EUCLIDEAN));
         w2.addDocument(doc);
         IllegalArgumentException expected =
             expectThrows(IllegalArgumentException.class, () -> w2.addIndexes(dir));
@@ -328,12 +326,12 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
         Directory dir2 = newDirectory()) {
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
         w.addDocument(doc);
       }
       try (IndexWriter w2 = new IndexWriter(dir2, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[5], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[5], VectorSimilarityFunction.DOT_PRODUCT));
         w2.addDocument(doc);
         try (DirectoryReader r = DirectoryReader.open(dir)) {
           IllegalArgumentException expected =
@@ -354,12 +352,12 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
         Directory dir2 = newDirectory()) {
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
         w.addDocument(doc);
       }
       try (IndexWriter w2 = new IndexWriter(dir2, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.EUCLIDEAN));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.EUCLIDEAN));
         w2.addDocument(doc);
         try (DirectoryReader r = DirectoryReader.open(dir)) {
           IllegalArgumentException expected =
@@ -380,12 +378,12 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
         Directory dir2 = newDirectory()) {
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
         w.addDocument(doc);
       }
       try (IndexWriter w2 = new IndexWriter(dir2, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[5], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[5], VectorSimilarityFunction.DOT_PRODUCT));
         w2.addDocument(doc);
         try (DirectoryReader r = DirectoryReader.open(dir)) {
           IllegalArgumentException expected =
@@ -404,12 +402,12 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
         Directory dir2 = newDirectory()) {
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
         w.addDocument(doc);
       }
       try (IndexWriter w2 = new IndexWriter(dir2, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.EUCLIDEAN));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.EUCLIDEAN));
         w2.addDocument(doc);
         try (DirectoryReader r = DirectoryReader.open(dir)) {
           IllegalArgumentException expected =
@@ -427,8 +425,8 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     try (Directory dir = newDirectory();
         IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
       Document doc = new Document();
-      doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
-      doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+      doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
+      doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
       IllegalArgumentException expected =
           expectThrows(IllegalArgumentException.class, () -> w.addDocument(doc));
       assertEquals(
@@ -448,10 +446,10 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
                   new VectorField(
                       "f",
                       new float[VectorValues.MAX_DIMENSIONS + 1],
-                      VectorValues.SimilarityFunction.DOT_PRODUCT)));
+                      VectorSimilarityFunction.DOT_PRODUCT)));
 
       Document doc2 = new Document();
-      doc2.add(new VectorField("f", new float[1], VectorValues.SimilarityFunction.EUCLIDEAN));
+      doc2.add(new VectorField("f", new float[1], VectorSimilarityFunction.EUCLIDEAN));
       w.addDocument(doc2);
     }
   }
@@ -463,13 +461,11 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
       Exception e =
           expectThrows(
               IllegalArgumentException.class,
-              () ->
-                  doc.add(
-                      new VectorField("f", new float[0], VectorValues.SimilarityFunction.NONE)));
+              () -> doc.add(new VectorField("f", new float[0], VectorSimilarityFunction.NONE)));
       assertEquals("cannot index an empty vector", e.getMessage());
 
       Document doc2 = new Document();
-      doc2.add(new VectorField("f", new float[1], VectorValues.SimilarityFunction.NONE));
+      doc2.add(new VectorField("f", new float[1], VectorSimilarityFunction.NONE));
       w.addDocument(doc2);
     }
   }
@@ -479,14 +475,14 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     try (Directory dir = newDirectory()) {
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
         w.addDocument(doc);
       }
       IndexWriterConfig iwc = newIndexWriterConfig();
       iwc.setCodec(Codec.forName("SimpleText"));
       try (IndexWriter w = new IndexWriter(dir, iwc)) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
         w.addDocument(doc);
         w.forceMerge(1);
       }
@@ -500,12 +496,12 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     try (Directory dir = newDirectory()) {
       try (IndexWriter w = new IndexWriter(dir, iwc)) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
         w.addDocument(doc);
       }
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("f", new float[4], VectorValues.SimilarityFunction.DOT_PRODUCT));
+        doc.add(new VectorField("f", new float[4], VectorSimilarityFunction.DOT_PRODUCT));
         w.addDocument(doc);
         w.forceMerge(1);
       }
@@ -513,8 +509,7 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
   }
 
   public void testInvalidVectorFieldUsage() {
-    VectorField field =
-        new VectorField("field", new float[2], VectorValues.SimilarityFunction.NONE);
+    VectorField field = new VectorField("field", new float[2], VectorSimilarityFunction.NONE);
 
     expectThrows(IllegalArgumentException.class, () -> field.setIntValue(14));
 
@@ -528,8 +523,7 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
         IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
       Document doc = new Document();
       doc.add(new StringField("id", "0", Field.Store.NO));
-      doc.add(
-          new VectorField("v", new float[] {2, 3, 5}, VectorValues.SimilarityFunction.DOT_PRODUCT));
+      doc.add(new VectorField("v", new float[] {2, 3, 5}, VectorSimilarityFunction.DOT_PRODUCT));
       w.addDocument(doc);
       w.addDocument(new Document());
       w.commit();
@@ -554,16 +548,12 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
         IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
       Document doc = new Document();
       doc.add(new StringField("id", "0", Field.Store.NO));
-      doc.add(
-          new VectorField(
-              "v0", new float[] {2, 3, 5}, VectorValues.SimilarityFunction.DOT_PRODUCT));
+      doc.add(new VectorField("v0", new float[] {2, 3, 5}, VectorSimilarityFunction.DOT_PRODUCT));
       w.addDocument(doc);
       w.commit();
 
       doc = new Document();
-      doc.add(
-          new VectorField(
-              "v1", new float[] {2, 3, 5}, VectorValues.SimilarityFunction.DOT_PRODUCT));
+      doc.add(new VectorField("v1", new float[] {2, 3, 5}, VectorSimilarityFunction.DOT_PRODUCT));
       w.addDocument(doc);
       w.forceMerge(1);
     }
@@ -575,13 +565,12 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     int[] fieldDocCounts = new int[numFields];
     float[] fieldTotals = new float[numFields];
     int[] fieldDims = new int[numFields];
-    VectorValues.SimilarityFunction[] fieldSearchStrategies =
-        new VectorValues.SimilarityFunction[numFields];
+    VectorSimilarityFunction[] fieldSearchStrategies = new VectorSimilarityFunction[numFields];
     for (int i = 0; i < numFields; i++) {
       fieldDims[i] = random().nextInt(20) + 1;
       fieldSearchStrategies[i] =
-          VectorValues.SimilarityFunction.values()[
-              random().nextInt(VectorValues.SimilarityFunction.values().length)];
+          VectorSimilarityFunction.values()[
+              random().nextInt(VectorSimilarityFunction.values().length)];
     }
     try (Directory dir = newDirectory();
         RandomIndexWriter w = new RandomIndexWriter(random(), dir, newIndexWriterConfig())) {
@@ -628,15 +617,15 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     try (Directory dir = newDirectory();
         IndexWriter iw = new IndexWriter(dir, newIndexWriterConfig())) {
       Document doc1 = new Document();
-      doc1.add(new VectorField(fieldName, v, VectorValues.SimilarityFunction.EUCLIDEAN));
+      doc1.add(new VectorField(fieldName, v, VectorSimilarityFunction.EUCLIDEAN));
       v[0] = 1;
       Document doc2 = new Document();
-      doc2.add(new VectorField(fieldName, v, VectorValues.SimilarityFunction.EUCLIDEAN));
+      doc2.add(new VectorField(fieldName, v, VectorSimilarityFunction.EUCLIDEAN));
       iw.addDocument(doc1);
       iw.addDocument(doc2);
       v[0] = 2;
       Document doc3 = new Document();
-      doc3.add(new VectorField(fieldName, v, VectorValues.SimilarityFunction.EUCLIDEAN));
+      doc3.add(new VectorField(fieldName, v, VectorSimilarityFunction.EUCLIDEAN));
       iw.addDocument(doc3);
       iw.forceMerge(1);
       try (IndexReader reader = iw.getReader()) {
@@ -691,16 +680,14 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
         IndexWriter iw = new IndexWriter(dir, newIndexWriterConfig())) {
       Document doc = new Document();
       float[] v = new float[] {1};
-      doc.add(new VectorField("field1", v, VectorValues.SimilarityFunction.EUCLIDEAN));
-      doc.add(
-          new VectorField("field2", new float[] {1, 2, 3}, VectorValues.SimilarityFunction.NONE));
+      doc.add(new VectorField("field1", v, VectorSimilarityFunction.EUCLIDEAN));
+      doc.add(new VectorField("field2", new float[] {1, 2, 3}, VectorSimilarityFunction.NONE));
       iw.addDocument(doc);
       v[0] = 2;
       iw.addDocument(doc);
       doc = new Document();
       doc.add(
-          new VectorField(
-              "field3", new float[] {1, 2, 3}, VectorValues.SimilarityFunction.DOT_PRODUCT));
+          new VectorField("field3", new float[] {1, 2, 3}, VectorSimilarityFunction.DOT_PRODUCT));
       iw.addDocument(doc);
       iw.forceMerge(1);
       try (IndexReader reader = iw.getReader()) {
@@ -761,9 +748,9 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
         if (random().nextBoolean() && values[i] != null) {
           // sometimes use a shared scratch array
           System.arraycopy(values[i], 0, scratch, 0, scratch.length);
-          add(iw, fieldName, i, scratch, VectorValues.SimilarityFunction.NONE);
+          add(iw, fieldName, i, scratch, VectorSimilarityFunction.NONE);
         } else {
-          add(iw, fieldName, i, values[i], VectorValues.SimilarityFunction.NONE);
+          add(iw, fieldName, i, values[i], VectorSimilarityFunction.NONE);
         }
         if (random().nextInt(10) == 2) {
           // sometimes delete a random document
@@ -834,7 +821,7 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
         }
         id2value[id] = value;
         id2ord[id] = i;
-        add(iw, fieldName, id, value, VectorValues.SimilarityFunction.EUCLIDEAN);
+        add(iw, fieldName, id, value, VectorSimilarityFunction.EUCLIDEAN);
       }
       try (IndexReader reader = iw.getReader()) {
         for (LeafReaderContext ctx : reader.leaves()) {
@@ -871,14 +858,14 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
       String field,
       int id,
       float[] vector,
-      VectorValues.SimilarityFunction similarityFunction)
+      VectorSimilarityFunction similarityFunction)
       throws IOException {
     add(iw, field, id, random().nextInt(100), vector, similarityFunction);
   }
 
   private void add(IndexWriter iw, String field, int id, int sortkey, float[] vector)
       throws IOException {
-    add(iw, field, id, sortkey, vector, VectorValues.SimilarityFunction.NONE);
+    add(iw, field, id, sortkey, vector, VectorSimilarityFunction.NONE);
   }
 
   private void add(
@@ -887,7 +874,7 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
       int id,
       int sortkey,
       float[] vector,
-      VectorValues.SimilarityFunction similarityFunction)
+      VectorSimilarityFunction similarityFunction)
       throws IOException {
     Document doc = new Document();
     if (vector != null) {
@@ -913,10 +900,10 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
     try (Directory dir = newDirectory()) {
       try (IndexWriter w = new IndexWriter(dir, newIndexWriterConfig())) {
         Document doc = new Document();
-        doc.add(new VectorField("v1", randomVector(3), VectorValues.SimilarityFunction.NONE));
+        doc.add(new VectorField("v1", randomVector(3), VectorSimilarityFunction.NONE));
         w.addDocument(doc);
 
-        doc.add(new VectorField("v2", randomVector(3), VectorValues.SimilarityFunction.NONE));
+        doc.add(new VectorField("v2", randomVector(3), VectorSimilarityFunction.NONE));
         w.addDocument(doc);
       }
 
@@ -937,10 +924,10 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
   public void testSimilarityFunctionIdentifiers() {
     // make sure we don't accidentally mess up similarity function identifiers by re-ordering their
     // enumerators
-    assertEquals(0, VectorValues.SimilarityFunction.NONE.ordinal());
-    assertEquals(1, VectorValues.SimilarityFunction.EUCLIDEAN.ordinal());
-    assertEquals(2, VectorValues.SimilarityFunction.DOT_PRODUCT.ordinal());
-    assertEquals(3, VectorValues.SimilarityFunction.values().length);
+    assertEquals(0, VectorSimilarityFunction.NONE.ordinal());
+    assertEquals(1, VectorSimilarityFunction.EUCLIDEAN.ordinal());
+    assertEquals(2, VectorSimilarityFunction.DOT_PRODUCT.ordinal());
+    assertEquals(3, VectorSimilarityFunction.values().length);
   }
 
   public void testAdvance() throws Exception {
@@ -952,7 +939,7 @@ public abstract class BaseVectorFormatTestCase extends BaseIndexFileFormatTestCa
           Document doc = new Document();
           // randomly add a vector field
           if (random().nextInt(4) == 3) {
-            doc.add(new VectorField(fieldName, new float[4], VectorValues.SimilarityFunction.NONE));
+            doc.add(new VectorField(fieldName, new float[4], VectorSimilarityFunction.NONE));
           }
           w.addDocument(doc);
         }
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/RandomPostingsTester.java b/lucene/test-framework/src/java/org/apache/lucene/index/RandomPostingsTester.java
index d6fcadd..45a3434 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/RandomPostingsTester.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/RandomPostingsTester.java
@@ -140,7 +140,7 @@ public class RandomPostingsTester {
               0,
               0,
               0,
-              VectorValues.SimilarityFunction.NONE,
+              VectorSimilarityFunction.NONE,
               false);
       fieldUpto++;
 
@@ -711,7 +711,7 @@ public class RandomPostingsTester {
               0,
               0,
               0,
-              VectorValues.SimilarityFunction.NONE,
+              VectorSimilarityFunction.NONE,
               false);
     }