One of the great things about Elasticsearch is its extensive REST API which allows you to integrate, manage and query the indexed data in countless different ways. Examples of using this API to integrate with Elasticsearch are abundant, spanning different companies and use cases.

    Documentation on the various API calls is extensive, and for some, this wealth of information can be somewhat daunting:

    Twitter

    This article will try and provide an overview of the main API calls that you should get acquainted with as you get started with Elasticsearch, and will add some usage examples and corresponding cURL commands. The API examples detailed below are Document API, Search API, Indices API, cat API and Cluster API.

    This is by no means a full API guide — this would be impossible and is covered in Elastic’s official documentation. Advanced users might find this cheat sheet we put together helpful as it contains some useful tips and best practices on the Elasticsearch Cluster API.

    Document API

    This category of APIs are used for handling documents in Elasticsearch. Using these APIs, for example, you will create documents in an index, update them, move them to another index, or remove them.
    The APIs detailed below are for handling single documents, but you can also make use of certain multi-document APIs for performing bulk actions (e.g. multi get).

    CategoryQuerycURL
    index – Add (or update) a document
    PUT /<<indexname>>
    curl -XPUT 
    'localhost:9200/twitter/my_index/my_type/1?pretty' 
    -H 'Content-Type: application/json' -d'
    {
       "field : "value",
       ...
    }
    '
    get – Retrieve a specific existing document
    GET /<<indexname>>
    curl -XGET
    'localhost:9200/my_index/
    my_type/0?pretty'
    delete – Delete a document
    DELETE /<<indexname>>
    curl -XDELETE
    'localhost:9200/my_index/
    my_type/0?pretty'
    reindex – Copies a document from one index to another
    POST /_reindex
    curl -XPOST
    'localhost:9200/_reindex?pretty'
    -H 'Content-Type:
     application/json' -d'
    {
     "source": {
       "index": "some_old_index"
     },
     "dest": {
       "index": "some_new_index"
     }
    }
    '
    multi get API (mget) – This lets you pull documents from multiple indices, specifying as many docs as necessary per index
    GET /<<targetindex>>/_mget
    curl -X GET 
    "localhost:9200/_mget?pretty" 
    -H 'Content-Type: application/json' -d'
    {
      "docs": [
        {
          "_index": "index1",
          "_id": "1"
        },
        {
          "_index": "index1",
          "_id": "2"
        }
      ]
    }
    
    bulk – This lets you perform multiple types of requests at once.
    POST /<<targetindex>>/_bulk
    curl -X POST 
    "localhost:9200/_bulk?pretty" 
    -H 'Content-Type: application/json' -d'
    { "index" : { "_index" : "test", "_id" : "1" } }
    { "delete" : { "_index" : "test", "_id" : "2" } }
    { "create" : { "_index" : "test", "_id" : "3" } }
    { "field1" : "value1" }}
    delete by query
    POST /<<targetindex>>/_delete_by_query
    curl -X POST 
    "localhost:9200/index1/_delete_by_query?pretty" 
    -H 'Content-Type: application/json' -d'
    {
      "query": {
        "match": {
          "user.id": "gedalyahreback"
        }
      }
    }
    
    update by query – the parameter at the end tells the query to proceed in the event there is a conflict between versions of a document
    POST /<<targetindex>>/_update_by_query
    curl -X POST 
    "localhost:9200/myindex1/ 
    _update_by_query?conflicts=proceed"

    Search API

    As its name implies, these API calls can be used to query indexed data for specific information. Search APIs can be applied globally, across all available indices and types, or more specifically within an index. Responses will contain matches to the specific query.  The Search API sometimes depends on usage of the Mustache language, which is implemented within Elasticsearch as a scripting language.

    CategoryQuerycURL
    Search – Enter a search query
    and return hits matching the query
    GET /<<targetindex>>/_search
    POST /<<targetindex>>/_search
    curl -XGET
    'localhost:9200/my_index/my_type/_count?q=field:
    value&pretty'
       
    Validate – Validate a potentially heavy
    query without actually executing it
    GET /<<targetindex>>/_validate/<<query>>
    curl -XGET
    'localhost:9200/my_index/my_type/
    _validate?q=field:value’
    Explain – Calculate a score for a query
    for getting feedback on whether
    a document matches the query or not
    GET /<<targetindex>>/_explain/<<id>>
    POST /<<targetindex>>/_explain/<<id>>
    curl -XGET
    'localhost:9200/my_index/my_type/0/
    _explain?q=message:search’
    Scroll
    GET /_search/scroll
    POST /_search/scroll
    DELETE /_search/scroll
    curl -X GET 
    "localhost:9200/_search/scroll?pretty" 
    -H 'Content-Type: application/json' -d'
    {}
    '
    Search Template
    GET /_search/template
    curl -X GET 
    "localhost:9200/_search/scroll?pretty" 
    -H 'Content-Type: application/json' -d'
    }
    '
    Storing a search template
    using the _scripts API
    POST _scripts/<<templateid>>
    DELETE _scripts/<<templateid>>
    curl -X POST 
    "localhost:9200/_scripts/<<templateid>>?pretty" 
    -H 'Content-Type: application/json' -d'
    {
      "script": {
        "lang": "mustache",
        "source": {
          "query": "{{some_template}}"
          }
        }
      }
    }

     

     

    Indices API

    This type of Elasticsearch API allows users to manage indices, mappings, and templates. For example, you can use this API to create or delete a new index, check if a specific index exists or not, and define new mapping for an index.

    Index Management

    CategoryQuerycURL
    Create a new Elasticsearch index
    PUT /<<indexname>>
    curl -XPUT 
    'localhost:9200/indexname?pretty' 
    -H 'Content-Type: application/json' -d'
    {
       "settings" : {
       "index" : {
          ...
         }
       }
    }
    '
    Delete an index
    DELETE /<<indexname>>
    curl -XDELETE 
    'localhost:9200/<<indexname>>?pretty'
    Open or Close an index
    POST /<<indexname>>/_open
    POST /<<indexname>>/_close
    curl -XPOST 
    'localhost:9200/<<indexname>>/_close?pretty'

     

    curl -XPOST 
    'localhost:9200/<<indexname>>/_open?pretty'
    Shrink
    POST /<<indexname>>/_shrink/<<indexname>>
    PUT /<<indexname>>/_shrink/<<indexname>>
    curl -XPOST 
    "localhost:9200/<<indexname>>/
    _shrink/shrunken-indexname"
    Split
    POST /<<indexname>>/_split/<<indexname>>
    PUT /<<indexname>>/_split/<<indexname>>
    curl -XPOST 
    "localhost:9200/indexname/_split/split-indexname" 
    -H 'Content-Type: application/json' -d'
    {
      "settings": {
      "index.number_of_shards": 4
      }
    }
    '
    Clone
    POST /<<indexname>>/_clone/<<clonedindexname>> 
    PUT /<<indexname>>/_clone/<<clonedindexname>>
    curl -X POST 
    "localhost:9200/indexname/_clone/clonedindex"
    Resolve
    GET /_resolve/index/<<indexname>>
    curl -X GET 
    "localhost:9200/_resolve/index/indexname"
    Rollover
    POST /<<indextoroll>>/_rollover/<<newindex>> 
    POST /<<indextoroll>>/_rollover/
    curl -X POST 
    "localhost:9200/indextoroll/_rollover/newindex" 
    -H 'Content-Type: application/json' -d'
    {
      "conditions": {
      "max_age": "14d",
      "max_docs": 5000,
      "max_size": "15gb"
      }
    }
    '

    Mapping Management

    Add a new type to existing mapping
    PUT /<<indexname>>/_mapping
    PUT /_mapping
    curl -XPUT
    'localhost:9200/indexname/_mapping/user?pretty' 
    -H 'Content-Type: application/json' -d'
    {
      "properties": {
        "name": {
           "type": "text"
         }
       }
    }
    '
    Retrieve mapping for a specific field
    GET /<<indexname>>/_mapping
    GET /_mapping
    curl -XGET
    'localhost:9200/indexname/_mapping/
    my_type/field/my_field?pretty'

     

    cat API

    I personally love the cat API and use it whenever possible. The idea is to return data in a more user-friendly format as opposed to the normal JSON response. You can read about the various string parameters you can add to the cat commands here.

    CategoryQuerycURL
    Cat Indices – Gives us access
    to info & metrics
    regarding our indices
    GET /_cat/indicescurl -XGET 'localhost:9200/_cat/indices? v&health=red&pretty'
    Cat Health – Overview
    of index health
    GET /_cat/healthcurl -XGET 'localhost:9200/_cat/health? v&pretty'
    Cat Nodes – Info on
    Elasticsearch nodes
    #Tip: You can use headers to retrieve only relevant details on the nodes. Read here for more info.
    GET /_cat/nodescurl -XGET 'localhost:9200/_cat/nodes ?v&pretty'

    Besides the ones above, the other cat API options are: cat aliases, cat allocation, cat anomaly detectors, cat count, cat data frame analytics, cat datafeeds, cat fielddata, cat master, cat nodeattrs, cat pending tasks, cat plugins, cat recovery, cat repositories, cat shards, cat segments, cat snapshots, cat task management, cat templates, cat thread pool, cat trained model, cat transforms

    Ingest APIs

    CategoryQuerycURL
    Manage PipelinesPUT /_ingest/pipeline/<<pipelineID>>
    GET /_ingest/pipeline/<<pipelineID>>
    GET /_ingest/pipeline
    DELETE /_ingest/pipeline/<<pipelineID>>
    #versioning example
    curl -X PUT
    "localhost:9200/_ingest/pipeline/<>?pretty"
    -H 'Content-Type: application/json' -d'
    {
    "description" : "my pipe does this",
    "version" : 24,
    "processors" : [
    {
    "set" : {
    "field": "names",
    "value": "bartholomew"
    }
    }
    ]
    }
    Simulate PipelinesPOST /_ingest/pipeline/<pipeline>/_simulate
    GET /_ingest/pipeline/<pipeline>/_simulate
    POST /_ingest/pipeline/_simulate
    GET /_ingest/pipeline/_simulate

     

    Cluster API

    These are cluster-specific API calls that allow you to manage and monitor your Elasticsearch cluster. Most of the APIs allow you to define which Elasticsearch node to call using either the internal node ID, its name or its address.

    CategoryQuerycURL
    Cluster HealthGET _cluster/health/<<target>>cURL -XGET 'localhost:9200/_cluster/health?pretty'
    Cluster State — Filter with parameters
    in the call URL.
    GET _cluster/state/<<target>>cURL -XGET 'http://localhost:9200/_cluster/state' cluster
    Cluster Stats — Basic index metrics and node infoGET _cluster/stats/<<target>>cURL -XGET 'http://localhost:9200/_cluster/stats?my_node&pretty'
    _reroute – manual
    changes to
    shard allocation
    POST /_cluster/reroutecURL -X POST
    "localhost:9200/_cluster/reroute?pretty"
    -H 'Content-Type: application/json' -d'
    SettingsGET /_cluster/settings
    PUT /_cluster/settings

    Parameters: flat_settings, include_defaults, master_timeout, timeout
    cURL -X PUT "localhost:9200/_cluster/settings?flat_settings=true&pretty" -H 'Content-Type: application/json' -d'

    For advanced usage of cluster APIs, read this blog post.

    Ending with some tips

    It’s time to get your hands dirty! The best way to learn your way around these APIs is experimentation. There are plenty of resources which can help you with this, and a bunch of open source tools as well.

    First, read through the API conventions before you start here. These will help you learn about the different options that can be applied to the calls, how to construct the APIs and how to filter responses.

    I also recommend using the built-in console for playing around with the APIs — just enter your API in the editor on the left, and see the response from Elasticsearch on the right.

    A good thing to remember is that some APIs change and get deprecated from version to version, and it’s a good best practice to keep tabs on breaking changes.

    Twitter API

    The gradual removal of mapping types will affect the indexing and search APIs — you can see the effect of this change in the different versions here.

    The REST API is one of the main reasons why Elasticsearch, and the ELK stack as a whole, is so popular. The list above is merely the tip of the iceberg, but also a good reference point for getting started.

    Logz.io API

    Despite being a fully managed and hosted ELK solution, Logz.io provides a public API that is based on the Elasticsearch search API, albeit with some limitations. If you are using Logz.io, you can use this API to run search queries on the data you are shipping to your account. The query language used is Elasticsearch Search API DSL.

    In addition, the Alerts API allows Logz.io users to create, delete and manage alerts. Again, there are some limitations that you should be aware of pertaining to the amount of concurrent APIs called.

    Get started for free

    Completely free for 14 days, no strings attached.