[[semantic-search-api]] === Semantic search API ++++ Semantic search ++++ experimental::[] Semantic search uses a text embedding NLP model to generate a dense vector from the input query string. The resulting dense vector is then used in a <> against an index containing dense vectors created with the same text embedding model. The search results are semantically similar as learned by the model. [source,console] ---- GET my-index/_semantic_search { "query_string": "A picture of a snow capped mountain", "model_id": "my-text-embedding-model", "knn": { "field": "text_embedding", "k": 10, "num_candidates": 100 } } ---- // TEST[skip:TBD] [[semantic-search-api-request]] ==== {api-request-title} `GET /_semantic_search` `POST /_semantic_search` [[semantic-search-api-prereqs]] ==== {api-prereq-title} * If the {es} {security-features} are enabled, you must have the `read` <> for the target data stream, index, or alias. [[semantic-search-api-desc]] ==== {api-description-title} The semantic search API uses a text embedding model to create a dense vector representation of the query string. [[semantic-search-api-path-params]] ==== {api-path-parms-title} ``:: (Optional, string) Comma-separated list of data streams, indices, and aliases to search. Supports wildcards (`*`). To search all data streams and indices, use `*` or `_all`. [role="child_attributes"] [[semantic-search-api-query-params]] ==== {api-query-parms-title} include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=routing] [role="child_attributes"] [[semantic-search-api-request-body]] ==== {api-request-body-title} `model_id`:: (Required, string) include::{es-repo-dir}/ml/ml-shared.asciidoc[tag=model-id] `query_string`:: (Required, string) The input text to embed. `knn`:: (Required, object) include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=knn] `query`:: (Optional, <>) Defines the search definition using the <>. `text_embedding_config`:: (Object, optional) Override certain setting of the text embedding model's configuration .Properties of text_embedding inference [%collapsible%open] ===== `results_field`:::: (Optional, string) include::{es-repo-dir}/ml/ml-shared.asciidoc[tag=inference-config-results-field] `tokenization`:::: (Optional, object) include::{es-repo-dir}/ml/ml-shared.asciidoc[tag=inference-config-nlp-tokenization] + .Properties of tokenization [%collapsible%open] ====== `bert`:::: (Optional, object) include::{es-repo-dir}/ml/ml-shared.asciidoc[tag=inference-config-nlp-tokenization-bert] + .Properties of bert [%collapsible%open] ======= `truncate`:::: (Optional, string) include::{es-repo-dir}/ml/ml-shared.asciidoc[tag=inference-config-nlp-tokenization-truncate] ======= `roberta`:::: (Optional, object) include::{es-repo-dir}/ml/ml-shared.asciidoc[tag=inference-config-nlp-tokenization-roberta] + .Properties of roberta [%collapsible%open] ======= `truncate`:::: (Optional, string) include::{es-repo-dir}/ml/ml-shared.asciidoc[tag=inference-config-nlp-tokenization-truncate] ======= `mpnet`:::: (Optional, object) include::{es-repo-dir}/ml/ml-shared.asciidoc[tag=inference-config-nlp-tokenization-mpnet] + .Properties of mpnet [%collapsible%open] ======= `truncate`:::: (Optional, string) include::{es-repo-dir}/ml/ml-shared.asciidoc[tag=inference-config-nlp-tokenization-truncate] ======= ====== ===== include::{es-repo-dir}/search/search.asciidoc[tag=docvalue-fields-def] include::{es-repo-dir}/search/search.asciidoc[tag=fields-param-def] include::{es-repo-dir}/search/search.asciidoc[tag=source-filtering-def] include::{es-repo-dir}/search/search.asciidoc[tag=stored-fields-def] [role="child_attributes"] [[semantic-search-api-response-body]] ==== {api-response-body-title} The semantic search response has the same structure as a kNN search response.