Elasticsearch is a powerful tool for managing and querying structured, unstructured, and semi-structured data. One of its standout features is its ability to handle nested objects. These are invaluable when dealing with complex data structures, such as arrays of objects within a document. To fully harness the potential of nested data, you need to understand nesting queries and how Elasticsearch enables you to search these intricate data models efficiently.

In this blog post, we’ll cover everything you need to know about querying nested objects in Elasticsearch, from setup to advanced use cases.

What Are Nested Objects in Elasticsearch?

Nested objects allow you to model relationships between objects within the same document. Unlike regular object fields, which are flattened during indexing, nested objects maintain their parent-child relationships. This ensures that queries respect the original structure of the data.

Example of Nested Objects

Consider an e-commerce platform storing information about products and their reviews:

{
  "product_name": "Wireless Headphones",
  "reviews": [
    {
      "username": "user1",
      "rating": 5,
      "comment": "Excellent sound quality!"
    },
    {
      "username": "user2",
      "rating": 3,
      "comment": "Good but overpriced."
    }
  ]
}

Without nested objects, Elasticsearch would flatten the reviews array into unrelated fields, making it difficult to query specific combinations like finding reviews where rating=5 and username=user1.

By defining the reviews field as a nested type, Elasticsearch preserves the relationships between the fields within each review object.

 

Setting Up Nested Objects

To enable nested queries, you must define a field as nested during index creation:

PUT /products
{
  "mappings": {
    "properties": {
      "product_name": {
        "type": "text"
      },
      "reviews": {
        "type": "nested"
      }
    }
  }
}

 

Once this mapping is set, you can index your documents:

POST /products/_doc
{
  "product_name": "Wireless Headphones",
  "reviews": [
    {
      "username": "user1",
      "rating": 5,
      "comment": "Excellent sound quality!"
    },
    {
      "username": "user2",
      "rating": 3,
      "comment": "Good but overpriced."
    }
  ]
}

 

Querying Nested Objects

The nested Query

To search nested objects, use the nested query. This query targets fields of type nested and allows you to define filters or queries for nested data.

Basic Example

Let’s find all products where a review has a rating of 5 and a username of user1:

POST /products/_search
{
  "query": {
    "nested": {
      "path": "reviews",
      "query": {
        "bool": {
          "must": [
            { "match": { "reviews.username": "user1" } },
            { "match": { "reviews.rating": 5 } }
          ]
        }
      }
    }
  }
}

Here’s what’s happening:

  • path: Specifies the nested field to query (reviews).
  • query: Contains a bool query to combine multiple conditions (username and rating).

 

Filtering Nested Data

You can combine nested queries with filters to refine your results further. For instance, let’s filter products by rating without affecting the overall product search:

POST /products/_search
{
  "query": {
    "nested": {
      "path": "reviews",
      "query": {
        "range": {
          "reviews.rating": {
            "gte": 4
          }
        }
      },
      "score_mode": "avg"
    }
  }
}

This queries: 

  • range: Filters reviews with a rating greater than or equal to 4.
  • score_mode: Determines how scores from matching nested documents are aggregated (e.g., avg, sum, min, or max).

 

Sorting and Aggregating Nested Data

Sorting by Nested Fields

To sort products based on the highest review rating:

POST /products/_search
{
  "sort": [
    {
      "reviews.rating": {
        "order": "desc",
        "nested": {
          "path": "reviews"
        }
      }
    }
  ]
}

The nested parameter ensures the sorting respects the nested structure.

 

Aggregating Nested Data

To calculate the average rating for each product:

POST /products/_search
{
  "aggs": {
    "average_rating": {
      "nested": {
        "path": "reviews"
      },
      "aggs": {
        "avg_rating": {
          "avg": {
            "field": "reviews.rating"
          }
        }
      }
    }
  }
}

This query:

  • Uses a nested aggregation to focus on the reviews field.
  • Calculates the average reviews.rating using the avg aggregation.

 

Conclusion

Nested objects and queries are essential for working with complex data in Elasticsearch. By using the nested query effectively, you can maintain relationships within your data and retrieve highly accurate search results. Whether you’re building an e-commerce platform, a job portal, or a real estate application, understanding nested queries will significantly enhance your Elasticsearch capabilities.

Ready to dive into nested queries? Experiment with these examples and unlock the full potential of Elasticsearch for your data.

Category : #elasticsearch

Tags : #elasticsearch

0 Shares
pic

👋 Hi, Introducing Zuno PHP Framework. Zuno Framework is a lightweight PHP framework designed to be simple, fast, and easy to use. It emphasizes minimalism and speed, which makes it ideal for developers who want to create web applications without the overhead that typically comes with more feature-rich frameworks.