﻿---
title: Get started with semantic search
description: Quickstart for semantic search in Elasticsearch with the semantic_text workflow, which uses vector search and embeddings to match documents by meaning.
url: https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/get-started/semantic-search
products:
  - Elasticsearch
applies_to:
  - Elastic Cloud Serverless: Generally available
  - Elastic Stack: Generally available
---

# Get started with semantic search
If you want to get a sense of how semantic search works in Elasticsearch, this quickstart is for you. You use the [`semantic_text`](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/semantic-search/semantic-search-semantic-text) workflow, the simplest managed path for semantic search. First, you create an index and store your data in two forms: plain text for keyword matching and semantic representations in `semantic_text` (vector embeddings are generated and compared automatically using [vector search](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/vector) under the hood). Then you run a hybrid query that combines keyword search with semantic search on those embeddings and merges the results.
<note>
  This quickstart demonstrates [semantic search](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/semantic-search) with the `semantic_text` field type and [hybrid search](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/hybrid-search): it combines keyword-based full-text search with semantic search so you can match both exact terms and meaning. Semantic search relies on [vector search](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/vector): text is converted to embeddings and matched by similarity in vector space.For example, if a document contains the phrase "annual leave policy", a keyword search for "annual leave" will return it because the terms match. However, a search for "vacation rules" may not return the same document, because those exact words are not present.With semantic search and [vector search](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/vector), a query like "vacation rules" can still return the "annual leave policy" document, because it matches based on meaning rather than exact terms.With hybrid search, the same query can return both keyword and semantic matches, combining exact words with vector search by meaning so results stay useful.
</note>


## Prerequisites

A running Elasticsearch cluster. For the fastest way to follow this quickstart, [create a serverless project](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/deploy-manage/deploy/elastic-cloud/create-serverless-project) which includes a free Serverless trial.

## Get the data in

<stepper>
  <step title="Create an index mapping">
    Define the [index mapping](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/manage-data/data-store/mapping). The mapping specifies the fields in your index and their data types, including a plain text field for full-text search and a `semantic_text` field that powers semantic search through vector embeddings and [vector search](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/vector).
    ```json

    {
      "mappings": {
        "properties": {
          "semantic_text": { <1>
            "type": "semantic_text"
          },
          "content": { <2>
            "type": "text",
            "copy_to": "semantic_text" <3>
          }
        }
      }
    }
    ```

    <dropdown title="Example response">
      ```json
      {
        "acknowledged": true,
        "shards_acknowledged": true,
        "index": "semantic-embeddings"
      }
      ```
    </dropdown>
  </step>

  <step title="Index documents">
    Index documents with the [bulk API](https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-bulk). You only need to provide the content to the `content` field. The `copy_to` mapping copies the text into `semantic_text` and generates vector embeddings automatically, so you can run keyword search on `content` and semantic search on `semantic_text` for the same document.
    ```json

    { "index": { "_index": "semantic-embeddings" } }
    { "content": "After running, cool down with light cardio for a few minutes to lower your heart rate and reduce muscle soreness." }
    { "index": { "_index": "semantic-embeddings" } }
    { "content": "Marathon plans stress weekly mileage; carb loading before a race does not replace recovery between hard sessions." }
    { "index": { "_index": "semantic-embeddings" } }
    { "content": "Tune cluster performance by monitoring thread pools and refresh interval." }
    ```

    <dropdown title="Example response">
      ```json
      {
        "errors": false,
        "took": 600,
        "items": [
          {
            "index": {
              "_index": "semantic-embeddings",
              "_id": "akiYKZ0BGwHk8ONXXqmi",
              "_version": 1,
              "result": "created",
              "_shards": {
                "total": 1,
                "successful": 1,
                "failed": 0
              },
              "_seq_no": 0,
              "_primary_term": 1,
              "status": 201
            }
          },
          {
            "index": {
              "_index": "semantic-embeddings",
              "_id": "a0iYKZ0BGwHk8ONXXqmi",
              "_version": 1,
              "result": "created",
              "_shards": {
                "total": 1,
                "successful": 1,
                "failed": 0
              },
              "_seq_no": 0,
              "_primary_term": 1,
              "status": 201
            }
          },
          {
            "index": {
              "_index": "semantic-embeddings",
              "_id": "bEiYKZ0BGwHk8ONXXqmi",
              "_version": 1,
              "result": "created",
              "_shards": {
                "total": 1,
                "successful": 1,
                "failed": 0
              },
              "_seq_no": 1,
              "_primary_term": 1,
              "status": 201
            }
          }
        ]
      }
      ```
    </dropdown>
  </step>
</stepper>


## Search the data

Run a hybrid search using the [Search API](https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-search).
The JSON body is a hybrid query: a [reciprocal rank fusion (RRF) retriever](https://docs-v3-preview.elastic.dev/elastic/elasticsearch/tree/main/reference/elasticsearch/rest-apis/retrievers/rrf-retriever) runs two [match queries](https://docs-v3-preview.elastic.dev/elastic/elasticsearch/tree/main/reference/query-languages/query-dsl/query-dsl-match-query), one on `content` for keyword matching and one on `semantic_text` for semantic search, which uses [vector search](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/vector) under the hood, and merges the results.
<note>
  An [RRF retriever](https://docs-v3-preview.elastic.dev/elastic/elasticsearch/tree/main/reference/elasticsearch/rest-apis/retrievers/rrf-retriever) returns top documents based on the RRF formula. This enables hybrid search by combining results from keyword-based full-text queries and semantic search (through [vector search](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/vector)) into a single ranked list.
</note>

```json

{
  "retriever": {
    "rrf": {
      "retrievers": [
        {
          "standard": { 
            "query": {
              "match": {
                "content": "muscle soreness after jogging" <1>
              }
            }
          }
        },
        {
          "standard": { 
            "query": {
              "match": {
                "semantic_text": "muscle soreness after jogging" <2>
              }
            }
          }
        }
      ]
    }
  }
}
```

If a document ranks well in either query, it can appear in the combined list.
<dropdown title="Example response">
  In the example response below, the two hits show why combining keyword search and semantic search in a hybrid query matters.The top document contains the phrase _muscle soreness_ and _running_, so it fits both keyword search and ranks highly in semantic and vector search. The second document does not use those words at all; it talks about marathon training and recovery between sessions. A keyword-only search on `content` would likely miss or rank that document much lower, because the query terms are not in the text.Semantic search still matches it because marathon training and recovery relate to the same idea as soreness after a run - vector similarity captures the connection even without shared keywords. Hybrid search keeps the document that matches the words and also brings in documents that vector search surfaces by topic, even without the same vocabulary.Each `_score` is a relevance score for this search only. A higher score means that document ranked higher than the ones below it in the same response.
  ```json
  {
    "took": 202,
    "timed_out": false,
    "_shards": {
      "total": 6,
      "successful": 6,
      "skipped": 0,
      "failed": 0
    },
    "hits": {
      "total": {
        "value": 2, 
        "relation": "eq"
      },
      "max_score": 0.032786883, 
      "hits": [
        {
          "_index": "semantic-embeddings",
          "_id": "akiYKZ0BGwHk8ONXXqmi",
          "_score": 0.032786883, 
          "_source": {
            "content": "After running, cool down with light cardio for a few minutes to lower your heart rate and reduce muscle soreness."
          }
        },
        {
          "_index": "semantic-embeddings",
          "_id": "a0iYKZ0BGwHk8ONXXqmi",
          "_score": 0.016129032, 
          "_source": {
            "content": "Marathon plans stress weekly mileage; carb loading before a race does not replace recovery between hard sessions."
          }
        }
      ]
    }
  }
  ```
</dropdown>


## Next steps


### End-to-end tutorials

- [Semantic search with `semantic_text`](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/semantic-search/semantic-search-semantic-text) - Follow a full tutorial on how to set up semantic search and vector search with the `semantic_text` field type.
- [Semantic search with the inference API](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/semantic-search/semantic-search-inference) - Use the inference API with third-party embedding services (for example Cohere, Hugging Face, or OpenAI) to run semantic search with vector embeddings.
- [Hybrid search with `semantic_text`](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/hybrid-semantic-text) - Combine semantic search on `semantic_text` with full-text search on a text field, then merge results using RRF. Vector embeddings are generated and compared automatically.
- [Semantic search with ELSER](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/semantic-search/semantic-search-elser-ingest-pipelines) - Use the ELSER model for sparse vector search and semantic retrieval.
- [Dense and sparse vector ingest pipelines](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/vector/dense-versus-sparse-ingest-pipelines) - Implement vector search end to end with NLP models deployed in Elasticsearch: pick dense or sparse, deploy the model, build ingest pipelines, and query—without relying on `semantic_text`.


### Concepts and reference

- [Semantic search](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/semantic-search) - Compare the three workflows (`semantic_text`, inference API, or models deployed in-cluster) for meaning-based search and see how they differ in complexity.
- [Vector search](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/vector) - Work directly with `dense_vector` and `sparse_vector` fields, related queries, and manual vector implementations when you need control beyond managed semantic workflows.
- [Ranking and reranking](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/ranking) - Structure multi-stage pipelines: initial BM25, vector, or hybrid retrieval, then reranking with stronger models on smaller candidate sets.
- [Build your search queries](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/querying-for-search) - Choose Query DSL, ES|QL, or retrievers on the Search API depending on whether you need classic queries, analytics-style pipes, or composable retrieval pipelines.

To learn about more options, such as full-text, vector, and hybrid search, go to [Search approaches](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/search-approaches).
For a summary of vector search use cases, go to [Vector search use cases](https://docs-v3-preview.elastic.dev/elastic/docs-content/pull/7406/solutions/search/vector/vector-search-use-cases).