{"id":3567,"date":"2022-12-21T01:01:51","date_gmt":"2022-12-21T01:01:51","guid":{"rendered":"https:\/\/www.javaadvent.com\/?p=3567"},"modified":"2022-12-12T12:10:10","modified_gmt":"2022-12-12T12:10:10","slug":"elasticsearch-internals","status":"publish","type":"post","link":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html","title":{"rendered":"Elasticsearch Internals"},"content":{"rendered":"\n<p>Elasticsearch is as one of the leading solutions for Enterprise search (and not only). As such it is worth understanding how does it work internally in order to better leverage its capabilities. Let&#8217;s follow a short journey to understand how does Elasticsearch work internally.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">At the beginning there was only Lucene &#8230;<\/h3>\n\n\n\n<p>The <a href=\"https:\/\/lucene.apache.org\/\">Apache Lucene library<\/a> is an open-source library for full-text indexing. It is used by a number of applications to build a number of advanced search capabilities with Elasticsearch being one of them. Lucene is also used by a number of other Enterprise search applications such as Apache Solr. Why would one choose to use Apache Lucene or a search application build on top of it to implement search capabilities ? Why not use simple queries on top of i.e. a relational database already used by an application ? The key to this answer is the basic data structure used by Apache Lucene: an <a href=\"https:\/\/en.wikipedia.org\/wiki\/Inverted_index\">inverted index<\/a>.<\/p>\n\n\n\n<p>In a nutshell when we store (index) a text (a document) in Lucene it is split into tokens. Each distinct token in the inverted index points to the documents that contain it. This provides the possibility to implement faster algorithms for full text search covering a wider and more complex range of search scenarios. A traditional relational databases uses standard indexes based on data structures like a B-tree to improve performance and that provides lesser options for optimization. How is an inverted index stored by Apache Lucene internally ? It is stored in separate files on disk called Lucene segments:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Lucene_index.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"197\" data-attachment-id=\"3574\" data-permalink=\"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html\/lucene_index\" data-orig-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Lucene_index.png?fit=841%2C276&amp;ssl=1\" data-orig-size=\"841,276\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Lucene_index\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Lucene_index.png?fit=600%2C197&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Lucene_index.png?resize=600%2C197&#038;ssl=1\" alt=\"\" class=\"wp-image-3574\" srcset=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Lucene_index.png?w=841&amp;ssl=1 841w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Lucene_index.png?resize=300%2C98&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Lucene_index.png?resize=768%2C252&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Lucene_index.png?resize=508%2C167&amp;ssl=1 508w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Elasticsearch: a web server on top of Lucene &#8230;<\/h3>\n\n\n\n<p>Yes, Elasticsearch can be considered a web server build on top of the Lucene library or even a document-oriented database. It provides a number of important capabilities that are missing from the library itself such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>custering: Elasticsearch provides a robust mechanism to build a cluster of Elasticsearch instances for scalability and high availability<\/li>\n\n\n\n<li>JSON-based REST API<\/li>\n\n\n\n<li>caching<\/li>\n\n\n\n<li>a lot more &#8230;<\/li>\n<\/ul>\n\n\n\n<p>An index in Elasticsearch is ditributed in one or more primary shards and zero or more replica shards. In effect an Elasticsearch shard resides on a node from the Elasticsearch cluster and corresponds to a Lucene index:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elasticsearch_Lucene.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"197\" data-attachment-id=\"3589\" data-permalink=\"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html\/elasticsearch_lucene\" data-orig-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elasticsearch_Lucene.png?fit=841%2C276&amp;ssl=1\" data-orig-size=\"841,276\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Elasticsearch_Lucene\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elasticsearch_Lucene.png?fit=600%2C197&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elasticsearch_Lucene.png?resize=600%2C197&#038;ssl=1\" alt=\"\" class=\"wp-image-3589\" srcset=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elasticsearch_Lucene.png?w=841&amp;ssl=1 841w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elasticsearch_Lucene.png?resize=300%2C98&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elasticsearch_Lucene.png?resize=768%2C252&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elasticsearch_Lucene.png?resize=508%2C167&amp;ssl=1 508w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/figure><\/div>\n\n\n<p>An index in Elasticsearch may not have a field mapping (schema) defined explicitly. In that case Elasticsearch tries to deduct one automatically. A field may also have multiple types associated at the same time (i.e. text and keyword).<\/p>\n\n\n\n<p>Every search document returned is scored to determine how relevant that document is according to the search query. Earlier versions of Elasticsearch (prior to 5.0) used the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Tf%E2%80%93idf\">tf-idf<\/a> algorithm to determine score relevance but later versions use the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Okapi_BM25\">Okapi BM25<\/a> algorithm.<\/p>\n\n\n\n<p>Elasticsearch is designed with clustering in mind. It tries to balance the number of shards across the nodes in a cluster so that load is distributed evenly. Even replica shards may paticipate in search queries instead of only providing high availability. The shard for a document is determined based on a simple hash function on the document routing key (which is the document ID by default):<\/p>\n\n\n\n<p><code>shard = hash(routing_key) % number_of_primary_shards<\/code><\/p>\n\n\n\n<p>There are two options to add a new node to the cluster: either using a multicast address or unicast: with a list of one more existing nodes in the cluster.<\/p>\n\n\n\n<p>A mechanism in place to deal with potential conflicts is implemented by means of <a href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/current\/optimistic-concurrency-control.html\">optimistic locking<\/a>. This is achieved by explicitly specifying a version of the document expected to be currently in the index and if that is not the case the operation fails. Traditional relational databases in contrast implement pessimistic locking where certain parts of the schema can be locked to prevent unexpected modifications. This is not the case with Elasticsearch: we cannot lock an index or parts of it during a write request.<\/p>\n\n\n\n<p>Some general recommendations related to the number of shards and size of index are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>too small number of shards introduces a scalability bottleneck<\/li>\n\n\n\n<li>too many shards introduces performance and management overhead<\/li>\n\n\n\n<li>determining the number of primary shards should be based on an upfront planning<\/li>\n\n\n\n<li>putting large amounts of data in a single index should be avoided: if that is required the index should be split into montly\/weekly\/daily indices so that we keep the size of each index ideally between 5 and 10 GBs of data<\/li>\n\n\n\n<li>aliases to reference indexes should be used as much as possible<\/li>\n<\/ul>\n\n\n\n<p>How are requests processed in an Elasticsearch cluster ?<br>Let&#8217;s first see how an index request is processed:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/index_request.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"223\" data-attachment-id=\"3599\" data-permalink=\"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html\/index_request\" data-orig-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/index_request.png?fit=865%2C321&amp;ssl=1\" data-orig-size=\"865,321\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"index_request\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/index_request.png?fit=600%2C223&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/index_request.png?resize=600%2C223&#038;ssl=1\" alt=\"\" class=\"wp-image-3599\" srcset=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/index_request.png?w=865&amp;ssl=1 865w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/index_request.png?resize=300%2C111&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/index_request.png?resize=768%2C285&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/index_request.png?resize=508%2C189&amp;ssl=1 508w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/figure><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>the index request is sent to a coordinating node in the cluster<\/li>\n\n\n\n<li>the coordinating node routes the request to a shard<\/li>\n\n\n\n<li>the shard does not write the document imediately on disk by default (it can be forced though with a parameter) but to two in-memory areas: the memory buffer and the transaction log<\/li>\n\n\n\n<li>the in-memory areas are then flushed to disk<\/li>\n<\/ul>\n\n\n\n<p>Now let&#8217;s see how is a search request processed:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/search_request.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"249\" data-attachment-id=\"3600\" data-permalink=\"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html\/search_request\" data-orig-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/search_request.png?fit=888%2C369&amp;ssl=1\" data-orig-size=\"888,369\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"search_request\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/search_request.png?fit=600%2C249&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/search_request.png?resize=600%2C249&#038;ssl=1\" alt=\"\" class=\"wp-image-3600\" srcset=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/search_request.png?w=888&amp;ssl=1 888w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/search_request.png?resize=300%2C125&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/search_request.png?resize=768%2C319&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/search_request.png?resize=508%2C211&amp;ssl=1 508w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/figure><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>a search request is processed in two phases: fetch and query<\/li>\n\n\n\n<li>during the fetch phase the search request is forwarded by the coordinating node to all shards to determine which ones contain data matching the query<\/li>\n\n\n\n<li>during the query phase these shards are queried to retrieve data that is then aggregated by the coordinating node and returned back to the client<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Modules here, modules there, modules everywhere &#8230;<\/h3>\n\n\n\n<p>An Elasticsearch node is comprised internally of different modules. Earlier versions of Elasticsearch used a modified version of the Google Guice library for dependency injection. Effectively latest versions of Elasticsearch are moving away from it. Modules were bound to a Guice binder effectively enabling them to be injected and used wherever needed:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\/\/ b is a Guice binder\n modules.add(b -&gt; {\n                     b.bind(Node.class).toInstance(this);\n                     b.bind(NodeService.class).toInstance(nodeService);\n                     b.bind(NamedXContentRegistry.class).toInstance(xContentRegistry);\n                     b.bind(PluginsService.class).toInstance(pluginsService);\n                     b.bind(Client.class).toInstance(client);\n                     b.bind(NodeClient.class).toInstance(client);\n                     b.bind(Environment.class).toInstance(this.environment);\n                     b.bind(ThreadPool.class).toInstance(threadPool);\n                     b.bind(NodeEnvironment.class).toInstance(nodeEnvironment);\n       \u2026\n }\n<\/pre><\/div>\n\n\n<p>Some core modules are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>discovery and cluster formation: used for node discovery<\/li>\n\n\n\n<li>HTTP: for the HTTP REST API<\/li>\n\n\n\n<li>plugins: for managing the Elasticsearch plug-ins<\/li>\n\n\n\n<li>thread pools: thread pools used internally by Elasticsearch<\/li>\n\n\n\n<li>transport: communication layer for the Elasticsearch nodes<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">The evolving codebase &#8230;<\/h3>\n\n\n\n<p>The open source version of Elasticsearch can be cloned from the official <a href=\"https:\/\/github.com\/elastic\/elasticsearch\">Github repo<\/a>. Each version has a corresponding tag (i.e. v8.4.3) and there are also branches for minor versions (i.e. 8.5). The code is well structured and easy to understand. Here are some of the root folders of the repo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>client: implementation of the low level and high level Java REST clients<\/li>\n\n\n\n<li>distribution: gradle build scripts for building the various distributions (i.e. RPMs)<\/li>\n\n\n\n<li>docs: official Elasticsearch documentation organized in asciidoc format<\/li>\n\n\n\n<li>server: core Elasticsearch application, contains built-in core modules<\/li>\n\n\n\n<li>x-pack: implementation of the XPack extension<\/li>\n\n\n\n<li>plugins: Additional plugins part of Elasticsearch distribution<\/li>\n\n\n\n<li>modules: Additional modules implementing Elasticsearch functionality<\/li>\n<\/ul>\n\n\n\n<p>To understand how Elasticsearch boots up you can start from the <a href=\"https:\/\/github.com\/elastic\/elasticsearch\/blob\/8.5\/server\/src\/main\/java\/org\/elasticsearch\/node\/Node.java#L1261\">org.elasticsearch.node.Node#start()<\/a> method:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elastic_startup.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"249\" data-attachment-id=\"3605\" data-permalink=\"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html\/elastic_startup\" data-orig-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elastic_startup.png?fit=888%2C369&amp;ssl=1\" data-orig-size=\"888,369\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Elastic_startup\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elastic_startup.png?fit=600%2C249&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elastic_startup.png?resize=600%2C249&#038;ssl=1\" alt=\"\" class=\"wp-image-3605\" srcset=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elastic_startup.png?w=888&amp;ssl=1 888w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elastic_startup.png?resize=300%2C125&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elastic_startup.png?resize=768%2C319&amp;ssl=1 768w, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/11\/Elastic_startup.png?resize=508%2C211&amp;ssl=1 508w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p>We did a brief deep-dive into how Elasticsearch works. As with any software project the truth is in the code so you can checkout the <a href=\"https:\/\/github.com\/elastic\/elasticsearch\">Elasticsearch repo<\/a> and analyse certain parts of it, i.e. particular modules. This is particularly useful if you find yourself in a situation where you need to understand how something works and it is not quite clear from documentation or if you need to write an Elasticsearch plugin and cannot find a good reference example.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Elasticsearch is as one of the leading solutions for Enterprise search (and not only). As such it is worth understanding how does it work internally in order to better leverage its capabilities. Let&#8217;s follow a short journey to understand how does Elasticsearch work internally. At the beginning there was only Lucene &#8230; The Apache Lucene [&hellip;]<\/p>\n","protected":false},"author":50,"featured_media":3224,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[646],"tags":[666,484,251],"coauthors":[354],"class_list":["post-3567","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jvm-advent-2022","tag-architecture","tag-elasticsearch","tag-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Elasticsearch Internals - JVM Advent<\/title>\n<meta name=\"description\" content=\"Let&#039;s follow a short journey to understand how does Elasticsearch work internally.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Elasticsearch Internals - JVM Advent\" \/>\n<meta property=\"og:description\" content=\"Let&#039;s follow a short journey to understand how does Elasticsearch work internally.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html\" \/>\n<meta property=\"og:site_name\" content=\"JVM Advent\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Java-Advent-Calendar-229536173843473\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-21T01:01:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-21.png?fit=800%2C800&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"800\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Martin Toshev\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javaadvent\" \/>\n<meta name=\"twitter:site\" content=\"@javaadvent\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Martin Toshev\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2022\\\/12\\\/elasticsearch-internals.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2022\\\/12\\\/elasticsearch-internals.html\"},\"author\":{\"name\":\"Martin Toshev\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#\\\/schema\\\/person\\\/eb708044dd802fabc1b5c9d4e9ac2959\"},\"headline\":\"Elasticsearch Internals\",\"datePublished\":\"2022-12-21T01:01:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2022\\\/12\\\/elasticsearch-internals.html\"},\"wordCount\":1176,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2022\\\/12\\\/elasticsearch-internals.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/www.javaadvent.com\\\/content\\\/uploads\\\/2021\\\/12\\\/Feature-Image-Day-21.png?fit=800%2C800&ssl=1\",\"keywords\":[\"architecture\",\"elasticsearch\",\"java\"],\"articleSection\":[\"2022\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javaadvent.com\\\/2022\\\/12\\\/elasticsearch-internals.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2022\\\/12\\\/elasticsearch-internals.html\",\"url\":\"https:\\\/\\\/www.javaadvent.com\\\/2022\\\/12\\\/elasticsearch-internals.html\",\"name\":\"Elasticsearch Internals - JVM Advent\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2022\\\/12\\\/elasticsearch-internals.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2022\\\/12\\\/elasticsearch-internals.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/www.javaadvent.com\\\/content\\\/uploads\\\/2021\\\/12\\\/Feature-Image-Day-21.png?fit=800%2C800&ssl=1\",\"datePublished\":\"2022-12-21T01:01:51+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#\\\/schema\\\/person\\\/eb708044dd802fabc1b5c9d4e9ac2959\"},\"description\":\"Let's follow a short journey to understand how does Elasticsearch work internally.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2022\\\/12\\\/elasticsearch-internals.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javaadvent.com\\\/2022\\\/12\\\/elasticsearch-internals.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2022\\\/12\\\/elasticsearch-internals.html#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.javaadvent.com\\\/content\\\/uploads\\\/2021\\\/12\\\/Feature-Image-Day-21.png?fit=800%2C800&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/www.javaadvent.com\\\/content\\\/uploads\\\/2021\\\/12\\\/Feature-Image-Day-21.png?fit=800%2C800&ssl=1\",\"width\":800,\"height\":800},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2022\\\/12\\\/elasticsearch-internals.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javaadvent.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Elasticsearch Internals\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javaadvent.com\\\/\",\"name\":\"JVM Advent\",\"description\":\"The JVM Programming Advent Calendar\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javaadvent.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#\\\/schema\\\/person\\\/eb708044dd802fabc1b5c9d4e9ac2959\",\"name\":\"Martin Toshev\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a235abf761a167024d17889a980406ccd19f83785b09ee66cf15b0bf90784899?s=96&d=retro&r=g3e6ba52e2c53d134111bf2113ed8a2fb\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a235abf761a167024d17889a980406ccd19f83785b09ee66cf15b0bf90784899?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a235abf761a167024d17889a980406ccd19f83785b09ee66cf15b0bf90784899?s=96&d=retro&r=g\",\"caption\":\"Martin Toshev\"},\"url\":\"https:\\\/\\\/www.javaadvent.com\\\/author\\\/martivtoshev\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Elasticsearch Internals - JVM Advent","description":"Let's follow a short journey to understand how does Elasticsearch work internally.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html","og_locale":"en_US","og_type":"article","og_title":"Elasticsearch Internals - JVM Advent","og_description":"Let's follow a short journey to understand how does Elasticsearch work internally.","og_url":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html","og_site_name":"JVM Advent","article_publisher":"https:\/\/www.facebook.com\/Java-Advent-Calendar-229536173843473\/","article_published_time":"2022-12-21T01:01:51+00:00","og_image":[{"width":800,"height":800,"url":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-21.png?fit=800%2C800&ssl=1","type":"image\/png"}],"author":"Martin Toshev","twitter_card":"summary_large_image","twitter_creator":"@javaadvent","twitter_site":"@javaadvent","twitter_misc":{"Written by":"Martin Toshev","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html#article","isPartOf":{"@id":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html"},"author":{"name":"Martin Toshev","@id":"https:\/\/www.javaadvent.com\/#\/schema\/person\/eb708044dd802fabc1b5c9d4e9ac2959"},"headline":"Elasticsearch Internals","datePublished":"2022-12-21T01:01:51+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html"},"wordCount":1176,"commentCount":0,"image":{"@id":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-21.png?fit=800%2C800&ssl=1","keywords":["architecture","elasticsearch","java"],"articleSection":["2022"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html","url":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html","name":"Elasticsearch Internals - JVM Advent","isPartOf":{"@id":"https:\/\/www.javaadvent.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html#primaryimage"},"image":{"@id":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-21.png?fit=800%2C800&ssl=1","datePublished":"2022-12-21T01:01:51+00:00","author":{"@id":"https:\/\/www.javaadvent.com\/#\/schema\/person\/eb708044dd802fabc1b5c9d4e9ac2959"},"description":"Let's follow a short journey to understand how does Elasticsearch work internally.","breadcrumb":{"@id":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html#primaryimage","url":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-21.png?fit=800%2C800&ssl=1","contentUrl":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-21.png?fit=800%2C800&ssl=1","width":800,"height":800},{"@type":"BreadcrumbList","@id":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-internals.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javaadvent.com\/"},{"@type":"ListItem","position":2,"name":"Elasticsearch Internals"}]},{"@type":"WebSite","@id":"https:\/\/www.javaadvent.com\/#website","url":"https:\/\/www.javaadvent.com\/","name":"JVM Advent","description":"The JVM Programming Advent Calendar","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javaadvent.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.javaadvent.com\/#\/schema\/person\/eb708044dd802fabc1b5c9d4e9ac2959","name":"Martin Toshev","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a235abf761a167024d17889a980406ccd19f83785b09ee66cf15b0bf90784899?s=96&d=retro&r=g3e6ba52e2c53d134111bf2113ed8a2fb","url":"https:\/\/secure.gravatar.com\/avatar\/a235abf761a167024d17889a980406ccd19f83785b09ee66cf15b0bf90784899?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a235abf761a167024d17889a980406ccd19f83785b09ee66cf15b0bf90784899?s=96&d=retro&r=g","caption":"Martin Toshev"},"url":"https:\/\/www.javaadvent.com\/author\/martivtoshev"}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-21.png?fit=800%2C800&ssl=1","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":2360,"url":"https:\/\/www.javaadvent.com\/2020\/12\/how-to-keep-elasticsearch-in-sync-with-relational-databases.html","url_meta":{"origin":3567,"position":0},"title":"How to Keep Elasticsearch in Sync with Relational Databases?","author":"H\u00fcseyin Akdo\u011fan","date":"December 6, 2020","format":false,"excerpt":"Many businesses are looking to take advantage of Elasticsearch's powerful search capabilities using it in close relationship with existing relational databases. In this context, it\u2019s not rare to use Elasticsearch as a caching layer. At this point, a basic and important need arises which is synchronizing Elasticsearch with the database.\u2026","rel":"","context":"In &quot;2020&quot;","block_context":{"text":"2020","link":"https:\/\/www.javaadvent.com\/category\/2020"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2020\/12\/%D0%9A%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B0.jpg?fit=1024%2C770&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2020\/12\/%D0%9A%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B0.jpg?fit=1024%2C770&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2020\/12\/%D0%9A%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B0.jpg?fit=1024%2C770&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2020\/12\/%D0%9A%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B0.jpg?fit=1024%2C770&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":2178,"url":"https:\/\/www.javaadvent.com\/2019\/12\/elasticsearch-sql.html","url_meta":{"origin":3567,"position":1},"title":"Elasticsearch SQL","author":"Martin Toshev","date":"December 17, 2019","format":false,"excerpt":"The Elasticsearch engine Elasticsearch is one of the most widely search engines being used in a number of production deployments today. It is based on the Lucene search library and one of the key features it provides is a JSON-based query DSL on top of Lucene that provides an easier\u2026","rel":"","context":"In &quot;2019&quot;","block_context":{"text":"2019","link":"https:\/\/www.javaadvent.com\/category\/christmas-2019-is-coming"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2017\/12\/duke17.png?fit=280%2C280&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":3569,"url":"https:\/\/www.javaadvent.com\/2022\/12\/elasticsearch-8x-latest-and-greatest.html","url_meta":{"origin":3567,"position":2},"title":"Elasticsearch 8x latest and greatest","author":"Martin Toshev","date":"December 14, 2022","format":false,"excerpt":"Elasticsearch 8.0 became generaly available at the beginning of the year. The cornerstone of the 8x releases have been a number of performance, stability and security improvements. Apart from that new capabilities especially in the area of machine learning and NLP have also been introduced. In this article we will\u2026","rel":"","context":"In &quot;2022&quot;","block_context":{"text":"2022","link":"https:\/\/www.javaadvent.com\/category\/jvm-advent-2022"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-14.png?fit=800%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-14.png?fit=800%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-14.png?fit=800%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-14.png?fit=800%2C800&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":4470,"url":"https:\/\/www.javaadvent.com\/2023\/12\/free-enterprise-search-with-opensearch.html","url_meta":{"origin":3567,"position":3},"title":"Free enterprise search with OpenSearch","author":"Martin Toshev","date":"December 8, 2023","format":false,"excerpt":"At the beginning there was only Elasticsearch ... It all started when Elasticsearch and Kibana license was changed from Apache 2.0 to EL (Elastic License) and SSPL (Server Side Public License). OpenSearch (formerly OpenDistro for Elasticsearch) is a fork of the Apache 2.0 licensed versions (7.10.2) of Elasticsearch and Kibana\u2026","rel":"","context":"In &quot;2023&quot;","block_context":{"text":"2023","link":"https:\/\/www.javaadvent.com\/category\/2023"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-8.png?fit=800%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-8.png?fit=800%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-8.png?fit=800%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-8.png?fit=800%2C800&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":1235,"url":"https:\/\/www.javaadvent.com\/2017\/12\/testing-java-let-count-ways.html","url_meta":{"origin":3567,"position":4},"title":"Testing Java: Let Me Count the Ways","author":"Shelley Lambert","date":"December 25, 2017","format":false,"excerpt":"For years now, I have been testing Java and if there is a single statement to make about that activity, it is that there are many, many, many ways to test a Java Virtual Machine (JVM). From code reviews and static analysis, to unit and functional tests, through 3rd party\u2026","rel":"","context":"In &quot;2017&quot;","block_context":{"text":"2017","link":"https:\/\/www.javaadvent.com\/category\/2017"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2017\/12\/duke25.png?fit=280%2C280&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2567,"url":"https:\/\/www.javaadvent.com\/2020\/12\/impress-your-family-during-the-christmas-dinner-with-jhipster-magic.html","url_meta":{"origin":3567,"position":5},"title":"Impress your family during the Christmas dinner with JHipster magic","author":"Julien Dubois","date":"December 17, 2020","format":false,"excerpt":"Christmas is coming soon, and you'll soon be at the family dinner again, even if this year it will be a Teams meeting as we're doing everything virtually. As every year, it will be time for you to impress the other Java developers in your family with your mastery of\u2026","rel":"","context":"In &quot;2020&quot;","block_context":{"text":"2020","link":"https:\/\/www.javaadvent.com\/category\/2020"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2017\/12\/duke17.png?fit=280%2C280&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]}],"jetpack_likes_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/posts\/3567","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/users\/50"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/comments?post=3567"}],"version-history":[{"count":27,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/posts\/3567\/revisions"}],"predecessor-version":[{"id":4472,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/posts\/3567\/revisions\/4472"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/media\/3224"}],"wp:attachment":[{"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/media?parent=3567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/categories?post=3567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/tags?post=3567"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/coauthors?post=3567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}