
Elasticsearch embeddings can be used to improve search relevance by capturing semantic relationships between search queries and documents.
Embeddings can be trained on a dataset of text to generate dense vector representations of words and phrases, allowing for more accurate search results.
These vector representations can be used to compute similarity between search queries and documents, enabling more effective search and retrieval.
Embeddings can also be used to support more advanced search features, such as autocomplete and faceting.
Expand your knowledge: Elasticsearch Dense Vector
What Are Embeddings?
Embeddings are numerical vector representations of text that capture the relationships, context, and meaning of words, phrases, or documents. For example, similar concepts like "cat" and "dog" are closer together in the embedding space, while unrelated ones like "cat" and "car" are farther apart.
These vector representations are especially useful because they can convey complex relationships between words in a concise and efficient way. In essence, embeddings allow us to distill the essence of language into a numerical format that can be easily processed and compared.
Discover more: Elasticsearch Vector Db
Similar concepts like "cat" and "dog" are closer together in the embedding space because they share similar characteristics, such as being animals. This proximity in the embedding space reflects their semantic similarity.
Embeddings can be particularly useful in search applications, where they can help identify relevant results based on their semantic meaning. By using embeddings, search engines can go beyond simple keyword matching and provide more accurate and relevant results.
By capturing both lexical and semantic information, embeddings provide a powerful tool for search and other applications where understanding the nuances of language is crucial.
Check this out: Golang Embedding
Adding Embeddings to Elasticsearch
You can add a new field to the index in Elasticsearch where an embedding for each document will be stored. This field is given a type of dense_vector, which is the appropriate type when storing embeddings.
The dense_vector type accepts a few parameters, all of which are optional. These include the size of the vectors that will be stored (dims), whether the vectors should be indexed for searching (index), and the distance function to use when comparing vectors (similarity).
Here's an interesting read: Elastic Search by Field
To add an embedding field to the index, you can use the create_index() method of the Search class, which adds an explicitly typed field named embedding. The embedding field is given a type of dense_vector, which is the appropriate type when storing embeddings.
You can also use the ElasticsearchEmbeddings class to generate embeddings using a model deployed in an Elasticsearch cluster. This class requires an Elasticsearch connection object and the model_id of the model deployed in the cluster.
Here are the parameters you need to specify when initializing the ElasticsearchEmbeddings instance:
- client (MlClient) – An Elasticsearch ML client object
- model_id (str) – The model_id of the model deployed in the Elasticsearch cluster
- input_field (str) – The name of the key for the input text field in the document (defaults to ‘text_field’)
Working with Embeddings
Working with embeddings is a powerful way to analyze and understand text data in Elasticsearch. You can use the ElasticsearchEmbeddings class to generate embeddings using a model deployed in an Elasticsearch cluster.
To initialize an ElasticsearchEmbeddings instance, you need to provide an Elasticsearch ML client object, the model_id of the model deployed in the cluster, and the name of the key for the input text field in the document.
Explore further: Elastic Search Cluster
You can instantiate embeddings from Elasticsearch credentials using the from_credentials method, which requires the model_id, input field, Elasticsearch cloud ID, username, and password. Alternatively, you can use the from_es_connection method to create an instance from an existing Elasticsearch connection.
Here are the required parameters for the from_credentials method:
- model_id (str) - The model_id of the model deployed in the Elasticsearch cluster.
- input_field (str) - The name of the key for the input text field in the document.
- es_cloud_id (Optional[str]) - The Elasticsearch cloud ID to connect to.
- es_user (Optional[str]) - Elasticsearch username.
- es_password (Optional[str]) - Elasticsearch password.
Compute
Using ELSER as your embedding model can add significant load to your cluster, requiring additional compute power to handle the embedding workload.
The main contributor to cost will be the extra compute needed to create embeddings for each ingested document and embed search queries for semantic search.
If you're working with a smaller dataset (larger datasets or frequent ingest and search requests will likely require scaling those nodes at an additional cost.
Compute power is also a factor when using traditional embedding models, with cost determined by the amount of input tokens sent to the model or dedicated compute power used when running a dedicated server.
Storage
Storage is a crucial aspect to consider when working with embeddings.
Sparse embedding vectors are more compact than dense vectors, which means they require less storage space.
This can be a significant advantage, especially in scenarios where you're working with large datasets or limited resources.
Using dense vectors, on the other hand, might require more storage as well as more RAM, which can impact your system's performance.
Explore further: Elasticsearch Storage
Creating Pipeline
Creating a pipeline for text embeddings is a crucial step in processing initial data. We create an ingest pipeline in the Kibana Console, specifically for text embeddings, and call it text-embeddings.
To map the text field to the field that the model expects, we define a field_map in the pipeline. This field_map maps the text field to text_field.
On_failure handler is set to index failures into a different index, which helps us track and handle any errors that may occur during the processing of the data.
We can create this pipeline by following the same steps as before, but with a focus on text embeddings. By doing so, we'll be able to add an embedding for each passage in our data.
Intriguing read: Elasticsearch Index Template
TwelveLabs Marengo with Bedrock

TwelveLabs Marengo with Bedrock is a powerful combination for working with embeddings.
You can use TwelveLabs' Marengo video embedding model with Amazon Bedrock and Elasticsearch to create a small app that searches video embeddings.
This setup allows for efficient storage and retrieval of video embeddings, which is a crucial aspect of working with embeddings.
The Marengo model is specifically designed for video embeddings, making it a great choice for applications that involve video analysis.
By combining Marengo with Bedrock and Elasticsearch, you can build a robust and scalable system for managing and searching video embeddings.
Vector Search and Similarity
Vector search in Elasticsearch allows you to find the most similar documents to a query, and from version 8.7, you can use the query_vector_builder parameter to generate embeddings from query terms during a search request.
With this feature, you can simply provide your model_id, such as "sentence-transformers__msmarco-minilm-l12-cos-v5", and model_text, the query string from which the model will generate a dense vector representation.
This approach enables you to get the top 10 closest documents to the query, sorted by their proximity to the query.
You might enjoy: Elasticsearch Updating Documents
Vector Similarity Search
Vector similarity search is a powerful tool that helps you find the most relevant documents to your search query.
In Elasticsearch v8.7 and later, you can use the query_vector_builder parameter of knn search to generate embeddings from query terms during a search request.
Providing your model_id, such as "sentence-transformers__msmarco-minilm-l12-cos-v5", is all you need to get started.
You can also provide the query string from which the model will generate the dense vector representation, known as model_text.
From Elasticsearch v8.13, it's optional to provide k and num_candidates parameters for knn search, making it even more convenient to use.
As a result, you get the top 10 closest documents to your query, sorted by their proximity to the query.
Consider reading: Elasticsearch Knn Query
MCP for Smart Search
MCP for Smart Search is a powerful tool that can enhance the generative efficacy of Large Language Models (LLMs). Integrating MCP with Elastic's intelligent query layer can build an intelligent search system.
Elasticsearch and OpenSearch semantic fields have their differences. Elasticsearch semantic text is more complex, while OpenSearch semantic field is more configurable.
By using MCP, developers can simplify their search systems. This is because MCP can handle complex queries more efficiently than other systems.
Vector Search: Stay Relevant
To narrow down search results, filtering is often needed after performing vector search. In Elasticsearch, this can be achieved using the get_mapping() method.
You can add a new field to the index where an embedding for each document will be stored. This is done by giving a type of dense_vector to the field, which is the appropriate type when storing embeddings.
The dense_vector type accepts a few parameters, all of which are optional. These parameters include dims, index, and similarity.
The dims parameter determines the size of the vectors that will be stored. Since version 8.11, the dimensions are automatically assigned when the first document is inserted.
Indexing vectors for searching requires setting the index parameter to True, which is the default.
The similarity parameter determines the distance function to use when comparing vectors. The two most common ones are dot_product and cosine, with dot product being more efficient but requiring vectors to be normalized.
Expand your knowledge: Elasticsearch Index Format
Implicit generation of embeddings from query terms during a search request is supported in Elasticsearch v 8.7 and later. This is done using the query_vector_builder parameter of knn search.
To perform implicit vector generation, you need to provide your model_id and model_text – the query string from which the model will generate the dense vector representation.
Here's a summary of the parameters for the dense_vector type:
- dims: the size of the vectors that will be stored (optional, automatically assigned from version 8.11)
- index: whether to index vectors for searching (optional, default is True)
- similarity: the distance function to use when comparing vectors (optional, default is cosine)
Frequently Asked Questions
What is the difference between embeddings and vector embeddings?
Embeddings" is a technique that represents data as vectors, while "vector embeddings" specifically refers to the resulting vectors that capture meaningful information and relationships. Understanding the difference between the two is key to unlocking the power of vector-based data representation.
Featured Images: pexels.com


