---
setup:
- skip:
    features:
    - "headers"
    - "allowed_warnings_regex"
- requires:
    cluster_features: "mapper.vectors.int4_quantization"
    reason: "kNN float to half-byte quantization is required"
- do:
    indices.create:
      index: "int4_flat"
      body:
        settings:
          index:
            number_of_shards: 1
        mappings:
          properties:
            name:
              type: "keyword"
            vector:
              type: "dense_vector"
              dims: 4
              index: true
              similarity: "l2_norm"
              index_options:
                type: "int4_flat"
            another_vector:
              type: "dense_vector"
              dims: 4
              index: true
              similarity: "l2_norm"
              index_options:
                type: "int4_flat"
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    index:
      index: "int4_flat"
      id: "1"
      body:
        name: "cow.jpg"
        vector:
        - 230.0
        - 300.33
        - -34.8988
        - 15.555
        another_vector:
        - 130.0
        - 115.0
        - -1.02
        - 15.555
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    indices.flush: {}
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    index:
      index: "int4_flat"
      id: "2"
      body:
        name: "moose.jpg"
        vector:
        - -0.5
        - 100.0
        - -13
        - 14.8
        another_vector:
        - -0.5
        - 50.0
        - -1
        - 1
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    indices.flush: {}
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    index:
      index: "int4_flat"
      id: "3"
      body:
        name: "rabbit.jpg"
        vector:
        - 0.5
        - 111.3
        - -13.0
        - 14.8
        another_vector:
        - -0.5
        - 11.0
        - 0
        - 12
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    indices.flush: {}
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    indices.forcemerge:
      max_num_segments: 1
      index: "int4_flat"
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    indices.refresh: {}
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
---
kNN search only:
- do:
    search:
      index: "int4_flat"
      body:
        fields:
        - "name"
        knn:
          field: "vector"
          query_vector:
          - -0.5
          - 90.0
          - -10
          - 14.8
          k: 2
          num_candidates: 3
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- match:
    hits.hits.0._id: "2"
- match:
    hits.hits.0.fields.name.0: "moose.jpg"
- match:
    hits.hits.1._id: "3"
- match:
    hits.hits.1.fields.name.0: "rabbit.jpg"
---
kNN multi-field search only:
- do:
    search:
      index: "int4_flat"
      body:
        fields:
        - "name"
        knn:
        - field: "vector"
          query_vector:
          - -0.5
          - 90.0
          - -10
          - 14.8
          k: 2
          num_candidates: 3
        - field: "another_vector"
          query_vector:
          - -0.5
          - 11.0
          - 0
          - 12
          k: 2
          num_candidates: 3
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- match:
    hits.hits.0._id: "3"
- match:
    hits.hits.0.fields.name.0: "rabbit.jpg"
- match:
    hits.hits.1._id: "2"
- match:
    hits.hits.1.fields.name.0: "moose.jpg"
---
kNN search plus query:
- do:
    search:
      index: "int4_flat"
      body:
        fields:
        - "name"
        knn:
          field: "vector"
          query_vector:
          - -0.5
          - 90.0
          - -10
          - 14.8
          k: 2
          num_candidates: 3
        query:
          term:
            name:
              value: "cow.jpg"
              boost: 1.5
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- match:
    hits.hits.0._id: "1"
- match:
    hits.hits.0.fields.name.0: "cow.jpg"
- match:
    hits.hits.1._id: "2"
- match:
    hits.hits.1.fields.name.0: "moose.jpg"
- match:
    hits.hits.2._id: "3"
- match:
    hits.hits.2.fields.name.0: "rabbit.jpg"
---
kNN multi-field search with query:
- do:
    search:
      index: "int4_flat"
      body:
        fields:
        - "name"
        knn:
        - field: "vector"
          query_vector:
          - -0.5
          - 90.0
          - -10
          - 14.8
          k: 2
          num_candidates: 3
        - field: "another_vector"
          query_vector:
          - -0.5
          - 11.0
          - 0
          - 12
          k: 2
          num_candidates: 3
          boost: 2.0
        query:
          term:
            name:
              value: "cow.jpg"
              boost: 2.0
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- match:
    hits.hits.0._id: "3"
- match:
    hits.hits.0.fields.name.0: "rabbit.jpg"
- match:
    hits.hits.1._id: "1"
- match:
    hits.hits.1.fields.name.0: "cow.jpg"
- match:
    hits.hits.2._id: "2"
- match:
    hits.hits.2.fields.name.0: "moose.jpg"
---
kNN search with filter:
- do:
    search:
      index: "int4_flat"
      body:
        fields:
        - "name"
        knn:
          field: "vector"
          query_vector:
          - -0.5
          - 90.0
          - -10
          - 14.8
          k: 2
          num_candidates: 3
          filter:
            term:
              name: "rabbit.jpg"
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- match:
    hits.total.value: 1
- match:
    hits.hits.0._id: "3"
- match:
    hits.hits.0.fields.name.0: "rabbit.jpg"
- do:
    search:
      index: "int4_flat"
      body:
        fields:
        - "name"
        knn:
          field: "vector"
          query_vector:
          - -0.5
          - 90.0
          - -10
          - 14.8
          k: 2
          num_candidates: 3
          filter:
          - term:
              name: "rabbit.jpg"
          - term:
              _id: 2
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- match:
    hits.total.value: 0
---
KNN Vector similarity search only:
- do:
    search:
      index: "int4_flat"
      body:
        fields:
        - "name"
        knn:
          num_candidates: 3
          k: 3
          field: "vector"
          similarity: 110
          query_vector:
          - -0.5
          - 90.0
          - -10
          - 14.8
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- is_true: "hits.hits.0"
---
Vector similarity with filter only:
- do:
    search:
      index: "int4_flat"
      body:
        fields:
        - "name"
        knn:
          num_candidates: 3
          k: 3
          field: "vector"
          similarity: 110
          query_vector:
          - -0.5
          - 90.0
          - -10
          - 14.8
          filter:
            term:
              name: "moose.jpg"
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- length:
    hits.hits: 1
- match:
    hits.hits.0._id: "2"
- match:
    hits.hits.0.fields.name.0: "moose.jpg"
- do:
    search:
      index: "int4_flat"
      body:
        fields:
        - "name"
        knn:
          num_candidates: 3
          k: 3
          field: "vector"
          similarity: 110
          query_vector:
          - -0.5
          - 90.0
          - -10
          - 14.8
          filter:
            term:
              name: "cow.jpg"
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- length:
    hits.hits: 0
---
Cosine similarity with indexed vector:
- skip:
    features: "headers"
- do:
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    search:
      rest_total_hits_as_int: true
      body:
        query:
          script_score:
            query:
              match_all: {}
            script:
              source: "cosineSimilarity(params.query_vector, 'vector')"
              params:
                query_vector:
                - 0.5
                - 111.3
                - -13.0
                - 14.8
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- match:
    hits.total: 3
- match:
    hits.hits.0._id: "3"
- gte:
    hits.hits.0._score: 0.999
- lte:
    hits.hits.0._score: 1.001
- match:
    hits.hits.1._id: "2"
- gte:
    hits.hits.1._score: 0.998
- lte:
    hits.hits.1._score: 1.0
- match:
    hits.hits.2._id: "1"
- gte:
    hits.hits.2._score: 0.78
- lte:
    hits.hits.2._score: 0.8
---
Test bad parameters:
- do:
    catch: "bad_request"
    indices.create:
      index: "bad_int4_flat"
      body:
        mappings:
          properties:
            vector:
              type: "dense_vector"
              dims: 6
              index: true
              index_options:
                type: "int4_flat"
                m: 42
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    catch: "bad_request"
    indices.create:
      index: "bad_int4_flat"
      body:
        mappings:
          properties:
            vector:
              type: "dense_vector"
              dims: 6
              element_type: "byte"
              index: true
              index_options:
                type: "int4_flat"
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
---
Test odd dimensions fail indexing:
- do:
    catch: "bad_request"
    indices.create:
      index: "bad_hnsw_quantized"
      body:
        mappings:
          properties:
            vector:
              type: "dense_vector"
              dims: 5
              index: true
              similarity: "l2_norm"
              index_options:
                type: "int4_flat"
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    indices.create:
      index: "dynamic_dim_hnsw_quantized"
      body:
        mappings:
          properties:
            vector:
              type: "dense_vector"
              index: true
              similarity: "l2_norm"
              index_options:
                type: "int4_hnsw"
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    catch: "bad_request"
    index:
      index: "dynamic_dim_hnsw_quantized"
      body:
        vector:
        - 1.0
        - 2.0
        - 3.0
        - 4.0
        - 5.0
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    index:
      index: "dynamic_dim_hnsw_quantized"
      body:
        vector:
        - 1.0
        - 2.0
        - 3.0
        - 4.0
        - 5.0
        - 6.0
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
---
Vector rescoring has the same scoring as exact search for kNN section:
- requires:
    reason: "Quantized vector rescoring is required"
    test_runner_features:
    - "capabilities"
    capabilities:
    - method: "GET"
      path: "/_search"
      capabilities:
      - "knn_quantized_vector_rescore_oversample"
- skip:
    features: "headers"
    awaits_fix: "scores have changed slightly with native implementations"
- do:
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    search:
      index: "int4_flat"
      rest_total_hits_as_int: true
      body:
        fields:
        - "name"
        knn:
          field: "vector"
          query_vector:
          - -0.5
          - 90.0
          - -10
          - 14.8
          k: 3
          num_candidates: 3
          rescore_vector:
            oversample: 1.5
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- match:
    hits.total: 3
- set:
    hits.hits.0._score: "rescore_score0"
- set:
    hits.hits.1._score: "rescore_score1"
- set:
    hits.hits.2._score: "rescore_score2"
- do:
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    search:
      rest_total_hits_as_int: true
      body:
        query:
          script_score:
            query:
              match_all: {}
            script:
              source: "1.0 / (1.0 + Math.pow(l2norm(params.query_vector, 'vector'),\
                \ 2.0))"
              params:
                query_vector:
                - -0.5
                - 90.0
                - -10
                - 14.8
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- match:
    hits.total: 3
- match:
    hits.hits.0._score: "$rescore_score0"
- match:
    hits.hits.1._score: "$rescore_score1"
- match:
    hits.hits.2._score: "$rescore_score2"
---
Test index configured rescore vector:
- requires:
    cluster_features:
    - "mapper.dense_vector.rescore_vector"
    reason: "Needs rescore_vector feature"
- skip:
    features: "headers"
- do:
    indices.create:
      index: "int4_rescore_flat"
      body:
        settings:
          index:
            number_of_shards: 1
        mappings:
          properties:
            vector:
              type: "dense_vector"
              dims: 64
              index: true
              similarity: "max_inner_product"
              index_options:
                type: "int4_flat"
                rescore_vector:
                  oversample: 1.5
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    bulk:
      index: "int4_rescore_flat"
      refresh: true
      body: "{ \"index\": {\"_id\": \"1\"}}\n{ \"vector\": [0.077,  0.32 , -0.205,\
        \  0.63 ,  0.032,  0.201,  0.167, -0.313, 0.176,  0.531, -0.375,  0.334, -0.046,\
        \  0.078, -0.349,  0.272, 0.307, -0.083,  0.504,  0.255, -0.404,  0.289, -0.226,\
        \ -0.132, -0.216,  0.49 ,  0.039,  0.507, -0.307,  0.107,  0.09 , -0.265,\
        \ -0.285,  0.336, -0.272,  0.369, -0.282,  0.086, -0.132,  0.475, -0.224,\
        \  0.203,  0.439,  0.064,  0.246, -0.396,  0.297,  0.242, -0.028,  0.321,\
        \ -0.022, -0.009, -0.001  ,  0.031, -0.533,  0.45, -0.683,  1.331,  0.194,\
        \ -0.157, -0.1  , -0.279, -0.098, -0.176] }\n{ \"index\": {\"_id\": \"2\"\
        }}\n{ \"vector\": [0.196,  0.514,  0.039,  0.555, -0.042,  0.242,  0.463,\
        \ -0.348, -0.08 ,  0.442, -0.067, -0.05 , -0.001,  0.298, -0.377,  0.048,\
        \ 0.307,  0.159,  0.278,  0.119, -0.057,  0.333, -0.289, -0.438, -0.014, \
        \ 0.361, -0.169,  0.292, -0.229,  0.123,  0.031, -0.138, -0.139,  0.315, -0.216,\
        \  0.322, -0.445, -0.059,  0.071,  0.429, -0.602, -0.142,  0.11 ,  0.192,\
        \  0.259, -0.241,  0.181, -0.166, 0.082,  0.107, -0.05 ,  0.155,  0.011, \
        \ 0.161, -0.486,  0.569, -0.489,  0.901,  0.208,  0.011, -0.209, -0.153, -0.27\
        \ , -0.013] }\n{ \"index\": {\"_id\": \"3\"}}\n{ \"vector\": [0.196,  0.514,\
        \  0.039,  0.555, -0.042,  0.242,  0.463, -0.348, -0.08 ,  0.442, -0.067,\
        \ -0.05 , -0.001,  0.298, -0.377,  0.048, 0.307,  0.159,  0.278,  0.119, -0.057,\
        \  0.333, -0.289, -0.438, -0.014,  0.361, -0.169,  0.292, -0.229,  0.123,\
        \  0.031, -0.138, -0.139,  0.315, -0.216,  0.322, -0.445, -0.059,  0.071,\
        \  0.429, -0.602, -0.142,  0.11 ,  0.192,  0.259, -0.241,  0.181, -0.166,\
        \ 0.082,  0.107, -0.05 ,  0.155,  0.011,  0.161, -0.486,  0.569, -0.489, \
        \ 0.901,  0.208,  0.011, -0.209, -0.153, -0.27 , -0.013] }\n"
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- do:
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    search:
      rest_total_hits_as_int: true
      index: "int4_rescore_flat"
      body:
        knn:
          field: "vector"
          query_vector:
          - 0.128
          - 0.067
          - -0.08
          - 0.395
          - -0.11
          - -0.259
          - 0.473
          - -0.393
          - 0.292
          - 0.571
          - -0.491
          - 0.444
          - -0.288
          - 0.198
          - -0.343
          - 0.015
          - 0.232
          - 0.088
          - 0.228
          - 0.151
          - -0.136
          - 0.236
          - -0.273
          - -0.259
          - -0.217
          - 0.359
          - -0.207
          - 0.352
          - -0.142
          - 0.192
          - -0.061
          - -0.17
          - -0.343
          - 0.189
          - -0.221
          - 0.32
          - -0.301
          - -0.1
          - 0.005
          - 0.232
          - -0.344
          - 0.136
          - 0.252
          - 0.157
          - -0.13
          - -0.244
          - 0.193
          - -0.034
          - -0.12
          - -0.193
          - -0.102
          - 0.252
          - -0.185
          - -0.167
          - -0.575
          - 0.582
          - -0.426
          - 0.983
          - 0.212
          - 0.204
          - 0.03
          - -0.276
          - -0.425
          - -0.158
          k: 3
          num_candidates: 3
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- match:
    hits.total: 3
- set:
    hits.hits.0._score: "rescore_score0"
- set:
    hits.hits.1._score: "rescore_score1"
- set:
    hits.hits.2._score: "rescore_score2"
- do:
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    search:
      rest_total_hits_as_int: true
      index: "int4_rescore_flat"
      body:
        query:
          script_score:
            query:
              match_all: {}
            script:
              source: "double similarity = dotProduct(params.query_vector, 'vector');\
                \ return similarity < 0 ? 1 / (1 + -1 * similarity) : similarity +\
                \ 1"
              params:
                query_vector:
                - 0.128
                - 0.067
                - -0.08
                - 0.395
                - -0.11
                - -0.259
                - 0.473
                - -0.393
                - 0.292
                - 0.571
                - -0.491
                - 0.444
                - -0.288
                - 0.198
                - -0.343
                - 0.015
                - 0.232
                - 0.088
                - 0.228
                - 0.151
                - -0.136
                - 0.236
                - -0.273
                - -0.259
                - -0.217
                - 0.359
                - -0.207
                - 0.352
                - -0.142
                - 0.192
                - -0.061
                - -0.17
                - -0.343
                - 0.189
                - -0.221
                - 0.32
                - -0.301
                - -0.1
                - 0.005
                - 0.232
                - -0.344
                - 0.136
                - 0.252
                - 0.157
                - -0.13
                - -0.244
                - 0.193
                - -0.034
                - -0.12
                - -0.193
                - -0.102
                - 0.252
                - -0.185
                - -0.167
                - -0.575
                - 0.582
                - -0.426
                - 0.983
                - 0.212
                - 0.204
                - 0.03
                - -0.276
                - -0.425
                - -0.158
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- match:
    hits.total: 3
- match:
    hits.hits.0._score: "$rescore_score0"
- match:
    hits.hits.1._score: "$rescore_score1"
- match:
    hits.hits.2._score: "$rescore_score2"
---
no default oversample value:
- requires:
    cluster_features:
    - "mapper.dense_vector.default_oversample_value_for_bbq"
    reason: "Needs default_oversample_value_for_bbq feature"
- do:
    indices.get_mapping:
      index: "int4_flat"
    headers:
      Content-Type: "application/vnd.elasticsearch+json;compatible-with=8"
      Accept: "application/vnd.elasticsearch+json;compatible-with=8"
    allowed_warnings_regex:
    - "Use of the \\[max_size\\] rollover condition has been deprecated in favour\
      \ of the \\[max_primary_shard_size\\] condition and will be removed in a later\
      \ version"
    - "Parameter \\[confidence_interval\\] in \\[index_options\\] for dense_vector\
      \ field \\[[^\\]]+\\] is deprecated and will be removed in a future version"
- not_exists: "int4_flat.mappings.properties.vector.index_options.rescore_vector"
