Flask-Philo Elastic Search Connector

Elasticsearch is a distributed, RESTful search and analytics engine.

Where’s Elastic Search on Flask-Philo project

Elastic Search Redis client and connector can be found at:

https://github.com/Riffstation/flask-philo/tree/dev/flask_philo/db/elasticsearch

Importing Elastic Search Connection

To import Elastic Search connection, just do:

from flask_philo.db.elasticsearch.connection import get_pool as get_el_pool

elasticsearch_pool = get_el_pool()
client = elasticsearch_pool.connections['DEFAULT']

Setting up your development config file

In your flask app, in the file src/config/development/py, insert the following piece of code:

DATABASES = {
    'ELASTICSEARCH': {
        'DEFAULT': {
            'HOSTS': [
                {'host': 'localhost', 'port': '9200'}
            ]
        }
    }
}

Create an Index

elasticsearch_pool.create_index('test-index')

Bulk Indexing

documents = [
    {
        'id': 1, 'msg': 'user 1 create record from machine 3',
        'timestamp': datetime.now(),
    },

    {
        'id': 2, 'msg': 'user 2 update record from machine 6',
        'timestamp': datetime.now()
    },

    {
        'id': 3, 'msg': 'user 1 create table server 2',
        'timestamp': datetime.now()
    },
    {
        'id': 4, 'msg': 'user 1 create table server 2',
        'timestamp': datetime.now()
    },

]

elasticsearch_pool.bulk_index(
    index='test-index', doc_type='logs', data=documents)

assert len(documents) == elasticsearch_pool.count('test-index')

Searching

results = elasticsearch_pool.search(index='test-index')
assert len(docs) == len(results['hits']['hits'])

body = {
    'size': 2
}
results = elasticsearch_pool.search(
    index='test-index', body=body)
assert 2 == len(results['hits']['hits'])

body = {
    'query': {
        'match': {'msg': 'user'}
    }
}

results = elasticsearch_pool.search(
    index='test-index', doc_type='logs', body=body)

assert len(docs) == len(results['hits']['hits'])

body = {
    'query': {
        'match': {'msg': 'table'}
    }
}
results = elasticsearch_pool.search(
    index='test-index', doc_type='logs', body=body)
assert 2 == len(results['hits']['hits'])

body = {
    'query': {
        'bool': {
            'must': {
                'match': {'msg': 'user update record'},
            },
            'must_not': {
                'match': {'msg': 'create'}
            }

        }
    }
}
results = elasticsearch_pool.search(
    index='test-index', doc_type='logs', body=body)

Deleting Documents

elasticsearch_pool.index(
    index="test-index", doc_type='tweet', id=1, body={'hi': 'hello'})
elasticsearch_pool.delete('test-index', 'tweet', 1)