Object and nested types help you store and search complex data with multiple layers inside Elasticsearch.
Object and nested types in Elasticsearch
PUT /my_index
{
"mappings": {
"properties": {
"user": {
"type": "object",
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" }
}
},
"comments": {
"type": "nested",
"properties": {
"author": { "type": "text" },
"message": { "type": "text" }
}
}
}
}
}Object type stores data as a single JSON object inside a document.
Nested type stores arrays of objects separately to keep each object's fields linked during searches.
PUT /library
{
"mappings": {
"properties": {
"book": {
"type": "object",
"properties": {
"title": { "type": "text" },
"author": { "type": "text" }
}
}
}
}
}PUT /blog
{
"mappings": {
"properties": {
"comments": {
"type": "nested",
"properties": {
"user": { "type": "text" },
"comment": { "type": "text" }
}
}
}
}
}This program creates an index with object and nested types, adds a document, and searches for comments by author 'Bob'.
PUT /my_index
{
"mappings": {
"properties": {
"user": {
"type": "object",
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" }
}
},
"comments": {
"type": "nested",
"properties": {
"author": { "type": "text" },
"message": { "type": "text" }
}
}
}
}
}
POST /my_index/_doc/1
{
"user": {
"name": "Alice",
"age": 30
},
"comments": [
{ "author": "Bob", "message": "Great post!" },
{ "author": "Carol", "message": "Thanks for sharing." }
]
}
GET /my_index/_search
{
"query": {
"nested": {
"path": "comments",
"query": {
"match": { "comments.author": "Bob" }
}
}
}
}Use object type for simple nested data without needing separate queries.
Use nested type when you want to search inside arrays of objects without mixing fields from different objects.
Remember to use nested queries when searching nested fields to get correct results.
Object type stores grouped fields as one JSON object inside a document.
Nested type stores arrays of objects separately to keep their fields linked during searches.
Use nested queries to search inside nested fields correctly.
Practice
object and nested types in Elasticsearch?Solution
Step 1: Understand object type storage
Object type stores grouped fields as a single JSON object inside a document, meaning all fields are flattened and stored together.Step 2: Understand nested type storage
Nested type stores arrays of objects separately to maintain the relationship between fields within each object during searches.Final Answer:
Nested type stores arrays of objects separately to keep their fields linked during searches, while object type stores grouped fields as one JSON object. -> Option DQuick Check:
Nested keeps object fields linked = C [OK]
- Confusing object and nested storage behavior
- Thinking nested is only for numeric fields
- Assuming both types store data the same way
Solution
Step 1: Recall nested type syntax
To define a nested field, the type must be explicitly set to "nested" in the mapping.Step 2: Check options
"comments": { "type": "nested" } correctly sets "comments" field type to "nested". Other options use incorrect types for nested data.Final Answer:
"comments": { "type": "nested" } -> Option CQuick Check:
Nested type requires "type": "nested" [OK]
- Using "object" instead of "nested" for nested arrays
- Confusing text or keyword types with nested
- Omitting the type field
comments and this document:{"title": "Post", "comments": [{"user": "alice", "message": "Hi"}, {"user": "bob", "message": "Hello"}]}Which query will correctly find documents where
comments.user is "alice" and comments.message is "Hello" in the same comment object?Solution
Step 1: Understand nested query usage
To search inside nested fields and keep field relationships, use a nested query with the correct path and combined conditions inside it.Step 2: Analyze options
{ "query": { "nested": { "path": "comments", "query": { "bool": { "must": [ { "match": { "comments.user": "alice" } }, { "match": { "comments.message": "Hello" } } ] } } } } } uses a nested query on "comments" with a bool must for both user "alice" and message "Hello" in the same nested object. { "query": { "bool": { "must": [ { "match": { "comments.user": "alice" } }, { "match": { "comments.message": "Hello" } } ] } } } searches flattened fields, losing the link. { "query": { "term": { "comments.user": "alice" } } } only matches user. { "query": { "nested": { "path": "comments", "query": { "term": { "comments.message": "Hi" } } } } } searches for message "Hi" only.Final Answer:
Uses nested query to match both conditions in the same nested object. -> Option AQuick Check:
Nested query with bool must inside = A [OK]
- Using bool query without nested for nested fields
- Searching fields separately losing object linkage
- Using term query without nested path
{ "properties": { "tags": { "type": "nested", "properties": { "name": { "type": "keyword" } } } } }But your nested query returns no results even though documents have matching tags. What is the likely mistake?
Solution
Step 1: Check mapping correctness
The mapping correctly defines "tags" as nested with keyword "name" field, so mapping is fine.Step 2: Identify query mistake
If nested query returns no results, often the cause is using a regular bool query instead of a nested query to search nested fields, losing the link between nested objects.Final Answer:
You forgot to use a nested query; used a regular bool query instead. -> Option AQuick Check:
Nested fields require nested queries [OK]
- Using bool query without nested for nested fields
- Confusing object and nested types in mapping
- Using match query on keyword fields
orders containing product and quantity. You want to find documents where there is an order with product "apple" and quantity greater than 10, but also an order with product "banana" and quantity less than 5. Which query structure correctly finds such documents?Solution
Step 1: Understand nested query for multiple conditions
Each nested object must be queried separately to keep conditions linked inside the same nested object.Step 2: Analyze query options
{ "query": { "bool": { "must": [ { "nested": { "path": "orders", "query": { "bool": { "must": [ { "term": { "orders.product": "apple" } }, { "range": { "orders.quantity": { "gt": 10 } } } ] } } } }, { "nested": { "path": "orders", "query": { "bool": { "must": [ { "term": { "orders.product": "banana" } }, { "range": { "orders.quantity": { "lt": 5 } } } ] } } } } ] } } } uses two nested queries combined with bool must, one for "apple" orders with quantity > 10, another for "banana" orders with quantity < 5, correctly matching documents with both conditions in different nested objects.Step 3: Identify incorrect options
{ "query": { "nested": { "path": "orders", "query": { "bool": { "must": [ { "term": { "orders.product": "apple" } }, { "range": { "orders.quantity": { "gt": 10 } } }, { "term": { "orders.product": "banana" } }, { "range": { "orders.quantity": { "lt": 5 } } } ] } } } } tries to combine all conditions in one nested query, which requires all conditions in the same nested object (impossible for different products). { "query": { "bool": { "must": [ { "term": { "orders.product": "apple" } }, { "range": { "orders.quantity": { "gt": 10 } } }, { "term": { "orders.product": "banana" } }, { "range": { "orders.quantity": { "lt": 5 } } } ] } } } ignores nested queries, losing object linkage. { "query": { "nested": { "path": "orders", "query": { "term": { "orders.product": "apple" } } } } } only queries for "apple" product.Final Answer:
Uses separate nested queries for each product condition. -> Option BQuick Check:
Separate nested queries for each condition = A [OK]
- Combining multiple product conditions in one nested query
- Not using nested queries for nested fields
- Assuming all conditions apply to the same nested object
Ready to prove it?
Pass the test and this pattern moves unknown
