Skip to main content

Fluent API for generating elastic queries.

Project description

===============================
ESFluent
===============================

.. image:: https://travis-ci.org/planetlabs/es_fluent.svg
:target: https://travis-ci.org/planetlabs/es_fluent

.. image:: https://img.shields.io/pypi/v/es_fluent.svg
:target: https://pypi-hypernode.com/pypi/es_fluent


A user-friendly module for managing and composing elasticsearch queries.

.. doctest::

>>> from es_fluent.builder import QueryBuilder
>>> query_builder = QueryBuilder()
>>> query_builder.and_filter('term', 'planet', 'earth')
>>> query_builder.enable_source()
>>> query_builder.to_query()
{'filter': {'and': [{'term': {'planet': 'earth'}}]}, 'fields': [], '_source': True}

Supported Servers
-----------------

ESFluent only supports the 1.x stream of elasticsearch.

Features
--------

* A Fluent API for generating and composing queries.
* Support for many elasticsearch filter types.
* Pluggable filter definitions, currently we simply model existing
elasticsearch filters.


Concepts and Walkthrough
------------------------

We'll walk through some examples of getting started with ESFluent. If you're
the type that likes to shoot first and ask questions later, the tests will
exercise all of the API concepts.

The QueryBuilder
~~~~~~~~~~~~~~~~

The QueryBuilder encapsulates the entire query. It features
a :func:`~es_fluent.filters.core.Filter.to_query` method which generates a JSON
payload suitable for POST'ing to elasticsearch.

For the most part, you'll be adding chains of filters. The QueryBuilder offers
additional support for:

* Enabling or disabling the _source document. By default this is not returned,
but many use cases demand it. See
:func:`~es_fluent.builder.QueryBuilder.enable_source` and
:func:`~es_fluent.builder.QueryBuilder.disable_source`.
* Limiting returned fields. See :func:`~es_fluent.builder.QueryBuilder.add_field`.
* Configuring sorting. See :func:`~es_fluent.builder.QueryBuilder.sort`.

To create a :class:`~es_fluent.builder.QueryBuilder` instance:

.. code-block:: python

from es_fluent.builder import QueryBuilder
query = QueryBuilder()

Filter Basics
~~~~~~~~~~~~~

Having created a QueryBuilder instance, you're likely going to want
to add filter criteria. There are two ways of doing this: importing the filter
class directly and creating an instance of a filter by hand then agumenting
your QueryBuilder instance:

.. code-block:: python

from es_fluent.builder import QueryBuilder
from es_fluent.filters import Term

query = QueryBuilder()
query.add_filter(Term('field_name', 'field_value'))

The alternative approach is to use a shorthand notation:

.. code-block:: python

from es_fluent.builder import QueryBuilder

query = QueryBuilder()
# Args and kwargs are forwarded to appropriate constructors.
query.add_filter('range', 'field_name', lte=0.5)


Each Filter class has a registered name - see the `name` class attribute - that
is used as it's shorthand identifier.

Negation
~~~~~~~~

Taking a page out of various Python ORMs, we support the `~` operator to
negate filters. This effectively wraps the filter in a `not` filter in
elasticsearch:

.. code-block:: python

from es_fluent.builder import QueryBuilder
from es_fluent.filters import Term

query = QueryBuilder()
query.add_filter(~Term('field_name', 'field_value'))

This is equivalent to:

.. code-block:: python

from es_fluent.builder import QueryBuilder
from es_fluent.filters import Not, Term
query = QueryBuilder()
query.add_filter(Not(Term('field_name', 'field_value')))

And also equivalent to:

.. code-block:: python

from es_fluent.builder import QueryBuilder
query = QueryBuilder()
query.add_filter('~term', 'field_name', 'field_value')

Boolean Filters
~~~~~~~~~~~~~~~

Boolean filters contain a list of sub-filters. The API provides conveniences
for creating nested and / or clauses:

.. code-block:: python

from es_fluent.builder import QueryBuilder
query = QueryBuilder()
query.or_filter('term', 'field_name', 'field_value')
query.or_filter('term', 'another_field', 'another_value')

.. code-block:: python

from es_fluent.builder import QueryBuilder
query = QueryBuilder()
query.and_filter('term', 'field_name', 'field_value')
query.and_filter('term', 'another_field', 'another_value')

Note that with elasticsearch, you cannot have both an `And` and `Or` clause at
the root level:

.. code-block:: python

from es_fluent.builder import QueryBuilder
query = QueryBuilder()
query.or_filter('term', 'or_clause_field', 'or_clause_value')
query.and_filter('term', 'and_clause_field', 'and_clause_value')

But this can be achieved using:

.. code-block:: python

from es_fluent.builder import QueryBuilder
query = QueryBuilder()

and_clauses = And()
and_clauses.or_filter('term', 'or_clause_field', 'or_clause_value')
and_clauses.and_filter('term', 'and_clause_field', 'and_clause_value')

query.add_filter(and_clauses)




History
-------

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

es-fluent-0.0.3.tar.gz (24.4 kB view details)

Uploaded Source

Built Distribution

es_fluent-0.0.3-py2.py3-none-any.whl (13.6 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file es-fluent-0.0.3.tar.gz.

File metadata

  • Download URL: es-fluent-0.0.3.tar.gz
  • Upload date:
  • Size: 24.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for es-fluent-0.0.3.tar.gz
Algorithm Hash digest
SHA256 51c74d183f3d2bc45215394912480e0bd7b118aead1010cfb275888bbab22f78
MD5 31378b887321b40455f3cfbd0ec743ec
BLAKE2b-256 d27959d7161d31c2eadd8f5b2c45502a32effed9b06c26032c1ab530bf8ba9c3

See more details on using hashes here.

File details

Details for the file es_fluent-0.0.3-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for es_fluent-0.0.3-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 63be5aa0829dcf075e6b5991c639f3282c8302491a6c15a083693a36f5bbe297
MD5 cba10a3a0642392966bc00619e407c59
BLAKE2b-256 f1ac9071a83b4f16e5afd3756687ec882d14d4974e61356919a6830cde78b109

See more details on using hashes here.

Supported by

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