Blog

Power up your Python apps with OpenSearch: A complete tutorial

By December 22, 2025No Comments

OpenSearch is a modern, open source search and analytics suite designed for performance, scalability, and flexibility. It’s widely used for use cases such as log analysis, application monitoring, real-time data mining, and business intelligence. Integrating OpenSearch with Python web applications enables developers to equip their platforms with powerful search indexing and analytics capabilities, fully leveraging OpenSearch’s distributed architecture and advanced query capabilities.

Core OpenSearch concepts

Understanding foundational concepts helps you to use OpenSearch to its full potential:

  • Cluster: A group of nodes (servers) that work together to store, index, and search data. The cluster architecture enables scalability and redundancy, improving reliability and load balancing.
  • Node: A single server within a cluster that is involved in storage, indexing, and search operations. Nodes can specialize as master nodes (managing cluster state), data nodes (responsible for data storage and lookup), or client/coordination nodes (handling request routing).
  • Index: An organized collection of documents with similar characteristics (equivalent to a database table). Indexes support different datasets, such as records, metrics, or product catalogs.
  • Document: The basic unit of data, usually formatted in JSON. For example: record, record entry, user profile, or product description.
  • Mapping: Defines the index, index schema, data types, structure, and how document fields are parsed and stored.
  • Shard: Each index is divided into shards in order to distribute data. A shard can be a primary (original data) or a replica (redundant copy). This architecture allows OpenSearch to handle large datasets efficiently.
  • Query: Requests data based on conditions using OpenSearch query domain-specific language (DSL). It supports full-text, keyword, domain, and advanced queries.
  • Inverted index: Matches terms to the documents in which they appear, facilitating incredibly fast and accurate searches.
  • OpenSearch Dashboards: A visualization tool integrated into OpenSearch that allows users to discover, monitor, and analyze data in real time.

Setting up OpenSearch locally with Docker

Using Docker, OpenSearch can be easily deployed for local development, experimentation, or demos.

Step 1: Install Docker

Download and install Docker Desktop for your operating system.

Step 2: Docker Compose setup

Create a docker-compose.yml file:

text

version: '3'

services:

  opensearch-node1:

    image: opensearchproject/opensearch:latest

    container_name: opensearch-node1

    environment:

      - cluster.name=opensearch-cluster

      - node.name=opensearch-node1

      - discovery.type=single-node

      - bootstrap.memory_lock=true

      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"

      - plugins.security.disabled=true

    ulimits:

      memlock:

        soft: -1

        hard: -1

    volumes:

      - opensearch-data:/usr/share/opensearch/data

    ports:

      - 9200:9200

      - 9600:9600


  opensearch-dashboards:

    image: opensearchproject/opensearch-dashboards:latest

    container_name: opensearch-dashboards

    ports:

      - 5601:5601

    environment:

      - OPENSEARCH_HOSTS=http://opensearch-node1:9200

    depends_on:

      - opensearch-node1


volumes:

  opensearch-data:

Step 3: Bring up the cluster

Start OpenSearch and OpenSearch Dashboards:

bash

docker-compose up -d

Access OpenSearch at http://localhost:9200 and Dashboards at http://localhost:5601.

Integrating OpenSearch with a Python web application

Step 1: Install the OpenSearch Python client

Install the official OpenSearch Python client (see the OpenSearch Python Client Documentation at https://opensearch-project.github.io/opensearch-py/index.html):

bash

pip install opensearch-py

Step 2: Connect to OpenSearch

python

from opensearchpy import OpenSearch

client = OpenSearch(

    hosts=[{'host': 'localhost', 'port': 9200}],

    http_auth=('admin', 'admin'),  # If basic auth is enabled

    use_ssl=False,

    verify_certs=False,

    ssl_show_warn=False,

)


print(client.info())

Essential operations: Python code snippets

The following are some essential Python code snippets.

Creating an index

python

index_name = 'movies'

index_body = {

    "settings": {"number_of_shards": 1, "number_of_replicas": 0},

    "mappings": {

        "properties": {

            "title": {"type": "text"},

            "director": {"type": "keyword"},

            "year": {"type": "date"}

        }

    }

}

client.indices.create(index=index_name, body=index_body, ignore=400)

Adding a document

python

document = {

    "title": "Inception",

    "director": "Christopher Nolan",

    "year": "2010-07-16"

}

client.index(index=index_name, body=document, id=1, refresh=True)

 

Searching a document

python

query = {

    "query": {

        "match": {"director": "Nolan"}

    }

}

response = client.search(index=index_name, body=query)

print(response['hits']['hits'])

Deleting a document

python

client.delete(index=index_name, id=1)

Deleting an index

python

client.indices.delete(index=index_name, ignore=[400, 404])

Example: Integrating with Flask

python

from flask import Flask, request, jsonify

from opensearchpy import OpenSearch


app = Flask(__name__)

client = OpenSearch(hosts=[{'host': 'localhost', 'port': 9200}])


@app.route('/search', methods=['GET'])

def search():

    keyword = request.args.get('q', '')

    query = {

        "query": {

            "multi_match": {

                "query": keyword,

                "fields": ["title", "director"]

            }

        }

    }

    results = client.search(index='movies', body=query)

    hits = results.get('hits', {}).get('hits', [])

    return jsonify([hit['_source'] for hit in hits])


if __name__ == '__main__':

    app.run(debug=True)

Conclusion

OpenSearch is a feature-rich, open source search and analytics engine that can transform web applications with its high-performance, distributed architecture and flexible search options. Understanding fundamental concepts such as sets, nodes, pointers, documents, shards, and queries is essential to designing robust and scalable solutions. With easy local setup via Docker and powerful integration via Python, developers can quickly build advanced research and analytics platforms.

Author

  • Neel Shah is a DevOps engineer with a great passion for building communities around DevOps. An organizer of Google Cloud Gandhinagar, CNCF Gandhinagar, Hashicorp User Group Gandhinagar, and Open Source Weekend, Neel has served as a mentor for 15+ hackathons and open-source programs. He has also presented at more than 15 conferences, such as KubeCon India, OpenSearchCon Korea 2025, PlatformCon 2024, DevFest, HashiTalk India, LinuxFest Northwest, 90 Days of DevOps, and many more.

    View all posts