Evaluate kNN search settings Experimental

POST /{index}/_knn_eval

All methods and paths for this operation:

GET /{index}/_knn_eval

POST /{index}/_knn_eval

Estimate the recall and cost of approximate kNN search configurations on a dense_vector field against a more thorough baseline. The field must use the bbq_disk index type, and must not be inside a nested object.

Each knn_settings entry reports the mean recall of the baseline's top k, not of relevance judgments, plus included and excluded query counts and cost totals. A query is excluded from the mean recall when the candidate finds a document scoring above the baseline's lowest top k score. A baseline returning fewer than k hits fails that query, because recall at k is undefined. All configurations run against one point in time.

The default baseline uses a visit_percentage of 20 and a rescore_vector.oversample of 100. An exact full-precision baseline must be requested explicitly with allow_exact_baseline, and is limited to 100 million vector-by-query comparisons.

The request is refused when the search.knn_eval.enabled cluster setting or the index.knn_eval.enabled index setting is false.

Required authorization

  • Index privileges: read,view_index_metadata

Path parameters

  • index string | array[string] Required

    A comma-separated list of index names to search.

Query parameters

  • ignore_unavailable boolean

    If false, the request returns an error if it targets a missing or closed index.

    Default value is false.

  • allow_no_indices boolean

    If false, the request returns an error if any wildcard expression, index alias, or _all value targets only missing or closed indices. This behavior applies even if the request targets other open indices.

    Default value is true.

  • expand_wildcards

    The type of index that wildcard patterns can match. It supports comma-separated values, such as open,hidden.

    Supported values include:

    • all: Match any data stream or index, including hidden ones.
    • open: Match open, non-hidden indices. Also matches any non-hidden data stream.
    • closed: Match closed, non-hidden indices. Also matches any non-hidden data stream. Data streams cannot be closed.
    • hidden: Match hidden data streams and hidden indices. Must be combined with open, closed, or both.
    • none: Wildcard expressions are not accepted.

    Default value is open.

  • wait_for_completion boolean

    If true, the request waits for the evaluation to complete. A large evaluation can run for minutes, and closing the connection, for example because of a client or proxy timeout, cancels it. If false, the request returns a task identifier, and stores the completed response for retrieval through the task management API.

    Default value is true.

application/json

Body Required

  • field string Required

    The dense_vector field to evaluate.

  • k number Required

    The number of nearest neighbors to compute the recall for, from 1 to 1000.

  • query_source Required

    The source of the query vectors.

    Hide query_source attributes Show query_source attributes
    • from Required Discriminator

      Value is KnnEvalQuerySource.

    • size number Required

      The number of documents to sample, from 1 to 1000.

    • seed number

      The seed of the sampling, to sample the same documents across requests.

    • vectors array[object] Required

      The query vectors, from 1 to 1000 entries with unique identifiers.

  • baseline object

    The settings of the search that the knn_settings entries are compared with. If not specified, it uses a visit_percentage of 20 and a rescore_vector.oversample of 100.

    Hide baseline attributes Show baseline attributes object
    • visit_percentage number

      The percentage of postings to visit, from 0 to 100. 0 selects the automatic visit calculation.

    • num_candidates number

      The number of nearest neighbor candidates to consider per shard. It can't be less than k, or more than 10000 (9999 with sampling).

    • rescore_vector object

      The rescoring of the candidates. Only applies to quantized fields.

      Hide rescore_vector attribute Show rescore_vector attribute object
      • oversample number Required

        Applies the specified oversample factor to k on the approximate kNN search

    • exact boolean

      If true, compares every vector at full precision. Only applies to the baseline, requires allow_exact_baseline, and can't be combined with other settings.

      Default value is false.

  • knn_settings array[object] Required

    The kNN search settings to evaluate, from 1 to 32 unique entries.

    Hide knn_settings attributes Show knn_settings attributes object
    • visit_percentage number

      The percentage of postings to visit, from 0 to 100. 0 selects the automatic visit calculation.

    • num_candidates number

      The number of nearest neighbor candidates to consider per shard. It can't be less than k, or more than 10000 (9999 with sampling).

    • rescore_vector object

      The rescoring of the candidates. Only applies to quantized fields.

      Hide rescore_vector attribute Show rescore_vector attribute object
      • oversample number Required

        Applies the specified oversample factor to k on the approximate kNN search

    • exact boolean

      If true, compares every vector at full precision. Only applies to the baseline, requires allow_exact_baseline, and can't be combined with other settings.

      Default value is false.

  • allow_exact_baseline boolean

    If true, the baseline can be exact. An exact baseline compares every vector at full precision, and can severely slow down other searches.

    Default value is false.

Responses

  • 200 application/json
    Hide response attributes Show response attributes object
    • query_source object

      The source of the query vectors. Not returned when wait_for_completion is false.

      Hide query_source attribute Show query_source attribute object
      • from string Required

        How the query vectors were chosen.

        Values are docs or vectors.

    • baseline object

      The settings of the baseline search. Not returned when wait_for_completion is false.

      Hide baseline attributes Show baseline attributes object
      • visit_percentage number

        The percentage of postings to visit, from 0 to 100. 0 selects the automatic visit calculation.

      • num_candidates number

        The number of nearest neighbor candidates to consider per shard. It can't be less than k, or more than 10000 (9999 with sampling).

      • rescore_vector object

        The rescoring of the candidates. Only applies to quantized fields.

        Hide rescore_vector attribute Show rescore_vector attribute object
        • oversample number Required

          Applies the specified oversample factor to k on the approximate kNN search

      • exact boolean

        If true, compares every vector at full precision. Only applies to the baseline, requires allow_exact_baseline, and can't be combined with other settings.

        Default value is false.

      • rescore_window_capped boolean

        If true, the number of vectors to rescore exceeded the limit of 10000.

        Default value is false.

      • quantized_scores boolean

        If true, the hits were not rescored, so their scores are estimates, and no query is excluded from the mean recall.

        Default value is false.

    • baseline_took_ms number

      The time the baseline searches took, in milliseconds. Not returned when wait_for_completion is false.

    • baseline_vector_ops number

      The number of vector operations of the baseline searches. Not returned when wait_for_completion is false.

    • baseline_vector_ops_kind string

      What baseline_vector_ops counts. Not returned when wait_for_completion is false.

      Supported values include:

      • full_precision_scan: Full-precision comparisons across all the matching vectors.
      • quantized_visit_plus_rescore: Quantized visits plus full-precision rescoring.

      Values are full_precision_scan or quantized_visit_plus_rescore.

    • results array[object]

      The results of each knn_settings entry, in the order of the request. Not returned when wait_for_completion is false.

      Hide results attributes Show results attributes object
      • knn_settings object Required

        The evaluated settings.

        Hide knn_settings attributes Show knn_settings attributes object
        • visit_percentage number

          The percentage of postings to visit, from 0 to 100. 0 selects the automatic visit calculation.

        • num_candidates number

          The number of nearest neighbor candidates to consider per shard. It can't be less than k, or more than 10000 (9999 with sampling).

        • exact boolean

          If true, compares every vector at full precision. Only applies to the baseline, requires allow_exact_baseline, and can't be combined with other settings.

          Default value is false.

        • rescore_window_capped boolean

          If true, the number of vectors to rescore exceeded the limit of 10000.

          Default value is false.

        • quantized_scores boolean

          If true, the hits were not rescored, so their scores are estimates, and no query is excluded from the mean recall.

          Default value is false.

      • recall number | string | null Required

        The mean recall of the included queries, or null if no query is included.

      • included_queries number Required

        The number of queries included in the mean recall.

      • excluded_queries number Required

        The number of queries excluded from the mean recall, because the search found a document scoring above the baseline's lowest top k score.

      • took_ms number Required

        The time the searches took, in milliseconds.

      • vector_ops number Required

        The number of vector operations of the searches.

    • failures object

      The queries that failed, by query identifier. Not returned when wait_for_completion is false.

      Hide failures attribute Show failures attribute object
      • * object Additional properties
        Hide * attribute Show * attribute object
        • error object Required

          Cause and details about a request failure. This class defines the properties common to all error types. Additional details are also provided, that depend on the error type.

          Hide error attributes Show error attributes object
          • type string Required

            The type of error

          • reason string | null

            A human-readable explanation of the error, in English.

          • stack_trace string

            The server stack trace. Present only if the error_trace=true parameter was sent with the request.

          • caused_by object

            Cause and details about a request failure. This class defines the properties common to all error types. Additional details are also provided, that depend on the error type.

          • root_cause array[object]

            Cause and details about a request failure. This class defines the properties common to all error types. Additional details are also provided, that depend on the error type.

            Cause and details about a request failure. This class defines the properties common to all error types. Additional details are also provided, that depend on the error type.

            Cause and details about a request failure. This class defines the properties common to all error types. Additional details are also provided, that depend on the error type.

          • suppressed array[object]

            Cause and details about a request failure. This class defines the properties common to all error types. Additional details are also provided, that depend on the error type.

            Cause and details about a request failure. This class defines the properties common to all error types. Additional details are also provided, that depend on the error type.

            Cause and details about a request failure. This class defines the properties common to all error types. Additional details are also provided, that depend on the error type.

    • task string

      The identifier of the task that runs the evaluation. Only returned when wait_for_completion is false.

POST /{index}/_knn_eval
POST my-index/_knn_eval
{
  "field": "my_vector",
  "k": 10,
  "query_source": {
    "from": "docs",
    "size": 100,
    "seed": 42
  },
  "knn_settings": [
    { "visit_percentage": 1 },
    { "visit_percentage": 5 }
  ]
}
resp = client.knn_eval(
    index="my-index",
    field="my_vector",
    k=10,
    query_source={
        "from": "docs",
        "size": 100,
        "seed": 42
    },
    knn_settings=[
        {
            "visit_percentage": 1
        },
        {
            "visit_percentage": 5
        }
    ],
)
const response = await client.knnEval({
  index: "my-index",
  field: "my_vector",
  k: 10,
  query_source: {
    from: "docs",
    size: 100,
    seed: 42,
  },
  knn_settings: [
    {
      visit_percentage: 1,
    },
    {
      visit_percentage: 5,
    },
  ],
});
response = client.knn_eval(
  index: "my-index",
  body: {
    "field": "my_vector",
    "k": 10,
    "query_source": {
      "from": "docs",
      "size": 100,
      "seed": 42
    },
    "knn_settings": [
      {
        "visit_percentage": 1
      },
      {
        "visit_percentage": 5
      }
    ]
  }
)
$resp = $client->knnEval([
    "index" => "my-index",
    "body" => [
        "field" => "my_vector",
        "k" => 10,
        "query_source" => [
            "from" => "docs",
            "size" => 100,
            "seed" => 42,
        ],
        "knn_settings" => array(
            [
                "visit_percentage" => 1,
            ],
            [
                "visit_percentage" => 5,
            ],
        ),
    ],
]);
curl -X POST -H "Authorization: ApiKey $ELASTIC_API_KEY" -H "Content-Type: application/json" -d '{"field":"my_vector","k":10,"query_source":{"from":"docs","size":100,"seed":42},"knn_settings":[{"visit_percentage":1},{"visit_percentage":5}]}' "$ELASTICSEARCH_URL/my-index/_knn_eval"
var response = await client
    .KnnEvalAsync(indices: new[] { "my-index" }, d1 => d1
        .Field(x => x.MyVector)
        .K(10)
        .KnnSettings(d2 => d2
            .VisitPercentage(1f), d2 => d2
            .VisitPercentage(5f)
        )
        .QuerySource(new KnnEvalDocsQuerySource()
        {
            Seed = 42,
            Size = 100
        })
    );
Request example
Run `POST my-index/_knn_eval` to compare the recall of two `visit_percentage` values on a `bbq_disk` field, using 100 query vectors sampled from the stored documents.
{
  "field": "my_vector",
  "k": 10,
  "query_source": {
    "from": "docs",
    "size": 100,
    "seed": 42
  },
  "knn_settings": [
    { "visit_percentage": 1 },
    { "visit_percentage": 5 }
  ]
}
Response examples (200)
A response from `POST my-index/_knn_eval`, with the recall of each `knn_settings` entry against the default baseline.
{
  "query_source": {
    "from": "docs"
  },
  "baseline": {
    "visit_percentage": 20.0,
    "rescore_vector": {
      "oversample": 100.0
    }
  },
  "baseline_took_ms": 412,
  "baseline_vector_ops": 2048000,
  "baseline_vector_ops_kind": "quantized_visit_plus_rescore",
  "results": [
    {
      "knn_settings": {
        "visit_percentage": 1.0
      },
      "recall": 0.87,
      "included_queries": 100,
      "excluded_queries": 0,
      "took_ms": 35,
      "vector_ops": 102400
    },
    {
      "knn_settings": {
        "visit_percentage": 5.0
      },
      "recall": 0.97,
      "included_queries": 99,
      "excluded_queries": 1,
      "took_ms": 96,
      "vector_ops": 512000
    }
  ],
  "failures": {}
}