Skip to content

feat(elasticsearch): add ElasticsearchInferenceDenseRetriever#3525

Open
chakshu-dhannawat wants to merge 1 commit into
deepset-ai:mainfrom
chakshu-dhannawat:feat/elasticsearch-inference-dense-retriever
Open

feat(elasticsearch): add ElasticsearchInferenceDenseRetriever#3525
chakshu-dhannawat wants to merge 1 commit into
deepset-ai:mainfrom
chakshu-dhannawat:feat/elasticsearch-inference-dense-retriever

Conversation

@chakshu-dhannawat

Copy link
Copy Markdown
Contributor

Closes #2945.

Summary

Adds server-side dense retrieval via Elasticsearch's inference API — no local embedding model required. The query vector is generated by an Elasticsearch inference endpoint at search time using knn.query_vector_builder.text_embedding.

This completes the inference retriever family alongside the existing ElasticsearchInferenceSparseRetriever and ElasticsearchInferenceHybridRetriever.

Changes

ElasticsearchDocumentStore — three new methods:

  • _create_dense_retrieval_inference_body: builds the kNN search body with query_vector_builder (instead of a pre-computed query_vector), with optional filters and num_candidates
  • _dense_retrieval_inference: sync retrieval
  • _dense_retrieval_inference_async: async retrieval

ElasticsearchInferenceDenseRetriever — new @component:

  • __init__: document_store, inference_id, filters, top_k, num_candidates, filter_policy
  • run / run_async: sync and async retrieval
  • to_dict / from_dict: full serialization support
  • Exported from haystack_integrations.components.retrievers.elasticsearch

tests/test_cloud_dense_retriever.py:

  • Unit tests: init defaults/custom, validation errors, serde round-trip, run/run_async, filter policies, body shape (query_vector_builder present, query_vector absent), edge cases
  • Integration test class (@pytest.mark.integration) — skipped unless ELASTICSEARCH_URL, ELASTIC_API_KEY, and ELASTICSEARCH_DENSE_INFERENCE_ID are set

Usage

from haystack_integrations.document_stores.elasticsearch import ElasticsearchDocumentStore
from haystack_integrations.components.retrievers.elasticsearch import ElasticsearchInferenceDenseRetriever

document_store = ElasticsearchDocumentStore(
    hosts="https://my-cluster.es.io:443",
    api_key="...",
)
retriever = ElasticsearchInferenceDenseRetriever(
    document_store=document_store,
    inference_id=".multilingual-e5-small-elasticsearch",  # built-in on Serverless
)
result = retriever.run(query="Find documents about Paris")

Closes deepset-ai#2945.

Adds server-side dense retrieval via Elasticsearch's inference API
(`knn.query_vector_builder.text_embedding`). No local embedding model
is needed — Elasticsearch generates the query vector from the
inference endpoint at search time.

- `ElasticsearchDocumentStore._create_dense_retrieval_inference_body`:
  builds the kNN body with `query_vector_builder` instead of
  `query_vector`, supporting optional filters and `num_candidates`
- `_dense_retrieval_inference` / `_dense_retrieval_inference_async`:
  sync and async wrappers that call `_search_documents`
- `ElasticsearchInferenceDenseRetriever`: new `@component` with
  `run()` / `run_async()`, full `to_dict` / `from_dict` serialization,
  and `FilterPolicy` support
- `tests/test_cloud_dense_retriever.py`: unit tests (init, serde, run,
  filter policies, body shape, edge cases) + integration test class
  skipped without credentials
@chakshu-dhannawat chakshu-dhannawat requested a review from a team as a code owner July 2, 2026 04:01
@chakshu-dhannawat chakshu-dhannawat requested review from sjrl and removed request for a team July 2, 2026 04:01
@github-actions github-actions Bot added integration:elasticsearch type:documentation Improvements or additions to documentation labels Jul 2, 2026
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Coverage report (elasticsearch)

Click to see where and how coverage changed

FileStatementsMissingCoverageCoverage
(new stmts)
Lines missing
  integrations/elasticsearch/src/haystack_integrations/components/retrievers/elasticsearch
  inference_dense_retriever.py
  integrations/elasticsearch/src/haystack_integrations/document_stores/elasticsearch
  document_store.py 1619-1626, 1647-1655
Project Total  

This report was generated by python-coverage-comment-action

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

integration:elasticsearch type:documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ElasticsearchInferenceDenseRetriever (ES inference for dense, optional)

1 participant