Quick Links
- Working with nested objects
- Inner Hits with parent-child relationships
- Performance considerations and customizations
Introduction
Elasticsearch’s Inner Hits feature is a valuable tool for retrieving nested objects and parent-child documents. It allows users to return the child documents embedded within the parent document, providing a more detailed view of the data. This article will delve into the intricacies of Inner Hits, offering insights on how to effectively use this feature.
Inner Hits is particularly useful when dealing with nested objects or parent-child relationships. It allows you to retrieve not only the matching nested or child documents but also their parent documents in a single query. This can significantly improve the efficiency of your data retrieval process.
Working with nested objects: A practical example
Let’s start with an example. Suppose we have an index of books, where each book document has nested author documents. If we want to find all books written by an author named “John Doe”, we can use the Inner Hits feature to retrieve not only the matching author documents but also the parent book documents.
Here’s how you can do it:
Step 1: Defining the index
First, define your index with the nested type:
json PUT /books { "mappings": { "properties": { "authors": { "type": "nested", "properties": { "name": { "type": "text" } } } } } }
Step 2: Indexing documents
Then, index some documents:
json PUT /books/_doc/1 { "title": "Book 1", "authors": [ { "name": "John Doe" }, { "name": "Jane Doe" } ] }
Step 3: Utilizing the Inner Hits feature
Now, you can use the Inner Hits feature to find all books written by “John Doe”:
json GET /books/_search { "query": { "nested": { "path": "authors", "query": { "match": { "authors.name": "John Doe" } }, "inner_hits": {} } } }
In the response, you will see not only the matching author documents but also the parent book documents. This is the power of the Inner Hits feature.
Inner Hits with parent-child relationships
When dealing with parent-child relationships, the process is similar. You just need to replace the “nested” query with a “has_child” or “has_parent” query.
Performance considerations and customizations
It’s important to note that Inner Hits can be quite resource-intensive, especially when dealing with large amounts of data. Therefore, it’s recommended to use it sparingly and always monitor your Elasticsearch cluster’s performance.
In addition, you can customize the Inner Hits results by specifying the “size”, “from”, and “sort” parameters. For example, you can limit the number of Inner Hits returned or sort them by a specific field.
json GET /books/_search { "query": { "nested": { "path": "authors", "query": { "match": { "authors.name": "John Doe" } }, "inner_hits": { "size": 2, "sort": { "name": "asc" } } } } }