Loading

Index and search basics

Stack Serverless

This quickstart provides a hands-on introduction to the fundamental concepts of Elasticsearch: indices, documents, and field type mappings. You'll learn how to create an index, add documents, work with dynamic and explicit mappings, and perform your first basic searches.

Tip

The code examples are in Console syntax by default. You can convert into other programming languages in the Console UI.

You can follow this guide using any Elasticsearch deployment. To see all deployment options, refer to Deploy > Choosing your deployment type. To get started quickly, spin up a cluster locally in Docker.

Tip

This quickstart uses Elasticsearch APIs, but there are many other ways to add data to Elasticsearch.

You add data to Elasticsearch as JSON objects called documents. Elasticsearch stores these documents in searchable indices.

  1. Create an index

    Create a new index named books:

     PUT /books 

    The following response indicates the index was created successfully.

  2. Add a single document

    Use the following request to add a single document to the books index. If the index doesn't already exist, this request will automatically create it.

     POST books/_doc {
      "name": "Snow Crash",
      "author": "Neal Stephenson",
      "release_date": "1992-06-01",
      "page_count": 470
    }
    

    The response includes metadata that Elasticsearch generates for the document, including a unique _id for the document within the index.

  3. Add multiple documents

    Use the _bulk endpoint to add multiple documents in a single request. Bulk data must be formatted as newline-delimited JSON (NDJSON).

     POST /_bulk { "index" : { "_index" : "books" } }
    {"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585}
    { "index" : { "_index" : "books" } }
    {"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328}
    { "index" : { "_index" : "books" } }
    {"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227}
    { "index" : { "_index" : "books" } }
    {"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268}
    { "index" : { "_index" : "books" } }
    {"name": "The Handmaids Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311}
    

    You should receive a response indicating there were no errors.

  4. Use dynamic mapping

    Mappings define how data is stored and indexed in Elasticsearch, like a schema in a relational database.

    If you use dynamic mapping, Elasticsearch automatically creates mappings for new fields. The documents you've added so far have used dynamic mapping, because you didn't specify a mapping while creating the index.

    To see how dynamic mapping works, add a new document to the books index with a field that isn't available in the existing documents.

     POST /books/_doc {
      "name": "The Great Gatsby",
      "author": "F. Scott Fitzgerald",
      "release_date": "1925-04-10",
      "page_count": 180,
      "language": "EN"
    }
    
    1. The new field.

    View the mapping for the books index with the get mapping API. The new field language has been added to the mapping with a text data type.

     GET /books/_mapping 

    The following response displays the mappings that were created by Elasticsearch.

  5. Define explicit mapping

    Create an index named my-explicit-mappings-books and specify the mappings yourself. Pass each field's properties as a JSON object. This object should contain the field data type and any additional mapping parameters.

     PUT /my-explicit-mappings-books {
      "mappings": {
        "dynamic": false,
        "properties": {
          "name": { "type": "text" },
          "author": { "type": "text" },
          "release_date": { "type": "date", "format": "yyyy-MM-dd" },
          "page_count": { "type": "integer" }
        }
      }
    }
    
    1. dynamic: Turns off dynamic mapping for the index. If you don't define fields in the mapping, they'll still be stored in the document's _source field, but you can't index or search them.
    2. properties: Defines the fields and their corresponding data types.

    The following response indicates a successful operation.

    Explicit mappings are defined at index creation, and documents must conform to these mappings. You can also use the update mapping API. When an index has the dynamic flag set to true, you can add new fields to documents without updating the mapping, which allows you to combine explicit and dynamic mappings. Learn more about managing and updating mappings.

Indexed documents are available for search in near real-time, using the _search API.

  1. Search all documents

    Use the following request to search all documents in the books index:

     GET books/_search 
  2. Search with a match query

    Use the match query to search for documents that contain a specific value in a specific field. This is the standard query for full-text searches.

    Use the following request to search the books index for documents containing brave in the name field:

     GET books/_search {
      "query": {
        "match": {
          "name": "brave"
        }
      }
    }
    
    Tip

    This example uses Query DSL, which is the primary query language for Elasticsearch.

If you want to delete an index to start from scratch at any point, use the delete index API.

For example, use the following request to delete the indices created in this quickstart:

 DELETE /books DELETE /my-explicit-mappings-books
Warning

Deleting an index permanently deletes its documents, shards, and metadata.

This quickstart introduced the basics of creating indices, adding data, and performing basic searches with Elasticsearch. To try out similar steps from the Elasticsearch Python client, go to Build your first search query with Python. The following resources will help you understand Elasticsearch concepts better and dive into the basics of query languages for searching data: