Skip to main content

Use the Elasticsearch DSL with Pydantic models.

Project description

PyPi CI Code coverage Python Issues Commit activity Downloads License

🔍 elasticsearch-pydantic

Use the Elasticsearch DSL with Pydantic models.

This minimal library is for those who...

To interconnect the Elasticsearch DSL and Pydantic, we override a limited set of methods from the Elasticsearch Document and InnerDoc base classes with Pydantic's BaseModel functionality. Elasticsearch field types are inferred from the model's type annotations and can be overridden by using Annotated type hints.

Installation

Install the package from PyPI:

pip install elasticsearch-pydantic

Usage

To migrate from Elasticsearch DSL to elasticsearch-pydantic, just change your ORM classes to inherit from elasticsearch_pydantic.BaseDocument instead of elasticsearch_dsl.Document. Then, gradually replace your field definitions with Pydantic type annotations.

For example, in Elasticsearch DSL, you would typically define a document like this:

from elasticsearch_dsl import Document, Text, Date

class BlogPost(Document):
    title = Text()
    content = Text()
    published_at = Date()

With elasticsearch-pydantic, you can define the same document using Pydantic models:

from elasticsearch_pydantic import BaseDocument

class BlogPost(BaseDocument):
    title: str
    content: str
    published_at: datetime

And that's about it! You now get all the type-safety and validation benefits of Pydantic, while still being able to use the powerful features of Elasticsearch DSL.

Most Pydantic types are naturally mapped to Elasticsearch field types. To learn more about the field type mappings, see the mapping code.

Annotated types

You can use Annotated type hints to customize the Elasticsearch field types:

from typing import Annotated
from elasticsearch_dsl import Text, Keyword
from elasticsearch_pydantic import BaseDocument

class BlogPost(BaseDocument):
    title: Annotated[str, Text(analyzer="standard")]
    tags: Annotated[list[str], Keyword]

Field type aliases

For convenience, elasticsearch-pydantic provides type aliases for all standard Elasticsearch field types:

from elasticsearch_pydantic import BaseDocument, TextField, KeywordField

class BlogPost(BaseDocument):
    title: TextField
    tags: list[KeywordField]

Accessing meta fields

For convenience, the Elasticsearch meta fields (like _id, _index, _score, etc.) are directly accessible as attributes on your document models:

post = BlogPost(id="1", title="My first post")
print(post.id)        # Access the document ID
print(post.meta.index)  # Access the index name

The meta attribute is kept for compatibility with Elasticsearch DSL and contains all meta fields.

Compatibility

This library works fine with any of the following Pip packages installed:

The elasticsearch-pydantic library will automatically detect which Elasticsearch DSL is installed.

Development

To build this package and contribute to its development you need to install the build, setuptools and wheel packages:

pip install build setuptools wheel

(On most systems, these packages are already pre-installed.)

Development installation

Install package and test dependencies:

pip install -e .[tests,tests-es6]       # For elasticsearch-dsl~=6.0
pip install -e .[tests,tests-es6-major] # For elasticsearch6-dsl
pip install -e .[tests,tests-es7]       # For elasticsearch-dsl~=7.0
pip install -e .[tests,tests-es7-major] # For elasticsearch7-dsl
pip install -e .[tests,tests-es8]       # For elasticsearch-dsl~=8.0
pip install -e .[tests,tests-es8-major] # For elasticsearch8-dsl

Testing

Verify your changes against the test suite to verify.

ruff check .  # Code format and LINT
mypy .        # Static typing
pytest .      # Unit tests

Please also add tests for your newly developed code.

Build wheels

Wheels for this package can be built with:

python -m build

Support

If you have any problems using this package, please file an issue. We're happy to help!

License

This repository is released under the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

elasticsearch_pydantic-1.1.tar.gz (20.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

elasticsearch_pydantic-1.1-py3-none-any.whl (17.1 kB view details)

Uploaded Python 3

File details

Details for the file elasticsearch_pydantic-1.1.tar.gz.

File metadata

  • Download URL: elasticsearch_pydantic-1.1.tar.gz
  • Upload date:
  • Size: 20.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for elasticsearch_pydantic-1.1.tar.gz
Algorithm Hash digest
SHA256 f6272cf785d4cb918223ad769e9910076e8b4314aa37c038417aa02ea8c29a15
MD5 2ca2ace60dac1c439de03ea24abc74ae
BLAKE2b-256 2e21f1013eb5d4e14d6619762f0c0718c151c9e3ac2ba1d2a51f5d727a6ea875

See more details on using hashes here.

Provenance

The following attestation bundles were made for elasticsearch_pydantic-1.1.tar.gz:

Publisher: ci.yml on janheinrichmerker/elasticsearch-pydantic

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file elasticsearch_pydantic-1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for elasticsearch_pydantic-1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 80ce2e4f180a1c7eaa47e2e2ef3e4b2e27c184c49d57d74447bf27413b605765
MD5 b60b850933dbe99dd219a5d60e020192
BLAKE2b-256 58f4c620c857dc8c3f42c7c80686a6d6b7dea0b2c874ac783e18f09411c16503

See more details on using hashes here.

Provenance

The following attestation bundles were made for elasticsearch_pydantic-1.1-py3-none-any.whl:

Publisher: ci.yml on janheinrichmerker/elasticsearch-pydantic

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page