{"id":80712,"date":"2023-03-11T02:39:20","date_gmt":"2023-03-11T02:39:20","guid":{"rendered":"https:\/\/showbizztoday.com\/index.php\/2023\/03\/11\/elasticsearch-indexing-strategy-in-asset-management-platform-amp-by-netflix-technology-blog\/"},"modified":"2023-03-11T02:39:20","modified_gmt":"2023-03-11T02:39:20","slug":"elasticsearch-indexing-strategy-in-asset-management-platform-amp-by-netflix-technology-blog","status":"publish","type":"post","link":"https:\/\/showbizztoday.com\/index.php\/2023\/03\/11\/elasticsearch-indexing-strategy-in-asset-management-platform-amp-by-netflix-technology-blog\/","title":{"rendered":"Elasticsearch Indexing Strategy in Asset Management Platform (AMP) | by Netflix Technology Blog"},"content":{"rendered":"<p> [ad_1]<br \/>\n<\/p>\n<div>\n<p id=\"6999\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">By <a class=\"ae kl\" href=\"https:\/\/www.linkedin.com\/in\/burakbacioglu\/\" rel=\"noopener ugc nofollow\" target=\"_blank\">Burak Bacioglu<\/a>, <a class=\"ae kl\" href=\"https:\/\/www.linkedin.com\/in\/meenakshijindal\/\" rel=\"noopener ugc nofollow\" target=\"_blank\">Meenakshi Jindal<\/a><\/p>\n<p id=\"b65d\" class=\"pw-post-body-paragraph jn jo iq jp b jq lk js jt ju ll jw jx jy lm ka kb kc ln ke kf kg lo ki kj kk ij bi\">At Netflix, all of our digital media property (photographs, movies, textual content, and so on.) are saved in safe storage layers. We constructed an asset administration platform (AMP), codenamed <strong class=\"jp ir\">Amsterdam<\/strong>, to be able to simply set up and handle the metadata, schema, relations and permissions of those property. It can be chargeable for asset discovery, validation, sharing, and for triggering workflows.<\/p>\n<p id=\"9009\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">Amsterdam service makes use of varied options reminiscent of <a class=\"ae kl\" href=\"https:\/\/cassandra.apache.org\/\" rel=\"noopener ugc nofollow\" target=\"_blank\">Cassandra<\/a>, <a class=\"ae kl\" href=\"https:\/\/kafka.apache.org\/\" rel=\"noopener ugc nofollow\" target=\"_blank\">Kafka<\/a>, <a class=\"ae kl\" href=\"https:\/\/zookeeper.apache.org\/\" rel=\"noopener ugc nofollow\" target=\"_blank\">Zookeeper<\/a>, <a class=\"ae kl\" rel=\"noopener ugc nofollow\" target=\"_blank\" href=\"https:\/\/netflixtechblog.com\/ephemeral-volatile-caching-in-the-cloud-8eba7b124589\">EvCache<\/a> and so on. In this weblog, we will probably be specializing in how we make the most of <a class=\"ae kl\" href=\"https:\/\/www.elastic.co\" rel=\"noopener ugc nofollow\" target=\"_blank\">Elasticsearch<\/a> for indexing and search the property.<\/p>\n<p id=\"6ae1\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">Amsterdam is constructed on high of three storage layers.<\/p>\n<p id=\"9eae\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">The first layer, <strong class=\"jp ir\">Cassandra<\/strong>, is the supply of fact for us. It consists of near 100 tables (column households) , nearly all of that are reverse indices to assist question the property in a extra optimized approach.<\/p>\n<p id=\"61a4\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">The second layer is <strong class=\"jp ir\">Elasticsearch<\/strong>, which is used to find property based mostly on consumer queries. This is the layer we\u2019d wish to concentrate on on this weblog. And extra particularly, how we index and question over 7TB of knowledge in a read-heavy and repeatedly rising surroundings and preserve our Elasticsearch cluster wholesome.<\/p>\n<p id=\"3ea0\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">And lastly, we&#8217;ve got an Apache <strong class=\"jp ir\">Iceberg<\/strong> layer which shops property in a denormalized style to assist reply heavy queries for analytics use instances.<\/p>\n<p id=\"c2b1\" class=\"pw-post-body-paragraph jn jo iq jp b jq lk js jt ju ll jw jx jy lm ka kb kc ln ke kf kg lo ki kj kk ij bi\">Elasticsearch is without doubt one of the greatest and broadly adopted distributed, open supply search and analytics engines for all sorts of knowledge, together with textual, numerical, geospatial, structured or unstructured information. It gives easy APIs for creating indices, indexing or looking paperwork, which makes it simple to combine. No matter whether or not you employ in-house deployments or hosted options, you may shortly get up an Elasticsearch cluster, and begin integrating it out of your software utilizing one of many purchasers supplied based mostly in your programming language (Elasticsearch has a wealthy set of languages it helps; Java, Python, .Net, Ruby, Perl and so on.).<\/p>\n<p id=\"667a\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">One of the primary choices when integrating with Elasticsearch is designing the indices, their settings and mappings. <strong class=\"jp ir\">Settings<\/strong> embody index particular properties like variety of shards, analyzers, and so on. <strong class=\"jp ir\">Mapping<\/strong> is used to outline how paperwork and their fields are alleged to be saved and listed. You outline the info varieties for every area, or use dynamic mapping for unknown fields. You can discover extra data on settings and mappings on Elasticsearch <a class=\"ae kl\" href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/5.6\/mapping.html\" rel=\"noopener ugc nofollow\" target=\"_blank\">web site<\/a>.<\/p>\n<p id=\"4ac0\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">Most purposes in content material and studio engineering at Netflix take care of property; reminiscent of movies, photographs, textual content, and so on. These purposes are constructed on a microservices structure, and the Asset Management Platform gives asset administration to these dozens of providers for varied asset varieties. Each asset kind is outlined in a centralized schema registry service chargeable for storing asset kind taxonomies and relationships. Therefore, it initially appeared pure to create a distinct index for every asset kind. When creating index mappings in Elasticsearch, one has to outline the info kind for every area. Since totally different asset varieties might probably have fields with the identical title however with totally different information varieties; having a separate index for every kind would stop such kind collisions. Therefore we created round a dozen indices per asset kind with fields mapping based mostly on the asset kind schema. As we onboarded new purposes to our platform, we stored creating new indices for the brand new asset varieties. We have a schema administration microservice which is used to retailer the taxonomy of every asset kind; and this programmatically created new indices at any time when new asset varieties have been created on this service. All the property of a selected kind use the particular index outlined for that asset kind to create or replace the asset doc.<\/p>\n<figure class=\"lq lr ls lt gt lu gh gi paragraph-image\">\n<div role=\"button\" tabindex=\"0\" class=\"lv lw di lx bf ly\">\n<div class=\"gh gi lp\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*DQfg8USKquc3t9tdayuvQA.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*DQfg8USKquc3t9tdayuvQA.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*DQfg8USKquc3t9tdayuvQA.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*DQfg8USKquc3t9tdayuvQA.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*DQfg8USKquc3t9tdayuvQA.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*DQfg8USKquc3t9tdayuvQA.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*DQfg8USKquc3t9tdayuvQA.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" type=\"image\/webp\"\/><source data-testid=\"og\" srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*DQfg8USKquc3t9tdayuvQA.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*DQfg8USKquc3t9tdayuvQA.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*DQfg8USKquc3t9tdayuvQA.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*DQfg8USKquc3t9tdayuvQA.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*DQfg8USKquc3t9tdayuvQA.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*DQfg8USKquc3t9tdayuvQA.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*DQfg8USKquc3t9tdayuvQA.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"\/><img alt=\"\" class=\"bf lz ma c\" width=\"700\" height=\"334\" loading=\"lazy\" role=\"presentation\"\/><\/picture><\/div>\n<\/div><figcaption class=\"mb mc gj gh gi md me bd b be z dk\"><strong class=\"bd ko\">Fig 1. Indices based mostly on Asset Types<\/strong><\/figcaption><\/figure>\n<p id=\"0b15\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">As Netflix is now producing considerably extra originals than it used to once we began this venture a number of years in the past, not solely did the variety of property develop dramatically but additionally the variety of asset varieties grew from dozens to a number of hundreds. Hence the variety of Elasticsearch indices (per asset kind) in addition to asset doc indexing or looking RPS (requests per second) grew over time. Although this indexing technique labored easily for some time, attention-grabbing challenges began developing and we began to note efficiency points over time. We began to watch CPU spikes, lengthy working queries, cases going yellow\/crimson in standing.<\/p>\n<p id=\"79d1\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">Usually the very first thing to attempt is to scale up the Elasticsearch cluster horizontally by growing the variety of nodes or vertically by upgrading occasion varieties. We tried each, and in lots of instances it helps, however generally it&#8217;s a quick time period repair and the efficiency issues come again after some time; and it did for us. You know it&#8217;s time to dig deeper to grasp the foundation explanation for it.<\/p>\n<p id=\"3f16\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">It was time to take a step again and reevaluate our ES information indexing and sharding technique. Each index was assigned a set variety of 6 shards and a pair of replicas (outlined within the template of the index). With the rise within the variety of asset varieties, we ended up having roughly 900 indices (thus 16200 shards). Some of those indices had hundreds of thousands of paperwork, whereas lots of them have been very small with solely hundreds of paperwork. We discovered the foundation explanation for the CPU spike was unbalanced shards measurement. Elasticsearch nodes storing these giant shards turned scorching spots and queries hitting these cases have been timing out or very sluggish attributable to busy threads.<\/p>\n<p id=\"d17a\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">We modified our indexing technique and determined to create indices based mostly on time buckets, relatively than asset varieties. What this implies is, property created between t1 and t2 would go to the T1 bucket, property created between t2 and t3 would go to the T2 bucket, and so forth. So as a substitute of persisting property based mostly on their asset varieties, we&#8217;d use their ids (thus its creation time; as a result of the asset id is a time based mostly uuid generated on the asset creation) to find out which period bucket the doc ought to be endured to. Elasticsearch <a class=\"ae kl\" href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/current\/size-your-shards.html#shard-size-recommendation\" rel=\"noopener ugc nofollow\" target=\"_blank\">recommends<\/a> every shard to be underneath 65GB (AWS <a class=\"ae kl\" href=\"https:\/\/docs.aws.amazon.com\/elasticsearch-service\/latest\/developerguide\/sizing-domains.html\" rel=\"noopener ugc nofollow\" target=\"_blank\">recommends<\/a> them to be underneath 50GB), so we might create time based mostly indices the place every index holds someplace between 16\u201320GB of knowledge, giving some buffer for information development. Existing property might be redistributed appropriately to those precreated shards, and new property would at all times go to the present index. Once the scale of the present index exceeds a sure threshold (16GB), we&#8217;d create a brand new index for the subsequent bucket (minute\/hour\/day) and begin indexing property to the brand new index created. We created an <a class=\"ae kl\" href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/5.6\/indices-templates.html\" rel=\"noopener ugc nofollow\" target=\"_blank\">index template<\/a> in Elasticsearch in order that the brand new indices at all times use the identical settings and mappings saved within the template.<\/p>\n<p id=\"0cd2\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">We selected to index all variations of an asset within the the identical bucket &#8211; the one which retains the primary model. Therefore, despite the fact that new property can by no means be endured to an previous index (attributable to our time based mostly id era logic, they at all times go to the most recent\/present index); present property might be up to date, inflicting extra paperwork for these new asset variations to be created in these older indices. Therefore we selected a decrease threshold for the roll over in order that older shards would nonetheless be effectively underneath 50GB even after these updates.<\/p>\n<figure class=\"lq lr ls lt gt lu gh gi paragraph-image\">\n<div role=\"button\" tabindex=\"0\" class=\"lv lw di lx bf ly\">\n<div class=\"gh gi mf\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*j4I2cKE2MQlnziZPSzTrJA.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*j4I2cKE2MQlnziZPSzTrJA.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*j4I2cKE2MQlnziZPSzTrJA.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*j4I2cKE2MQlnziZPSzTrJA.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*j4I2cKE2MQlnziZPSzTrJA.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*j4I2cKE2MQlnziZPSzTrJA.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*j4I2cKE2MQlnziZPSzTrJA.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" type=\"image\/webp\"\/><source data-testid=\"og\" srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*j4I2cKE2MQlnziZPSzTrJA.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*j4I2cKE2MQlnziZPSzTrJA.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*j4I2cKE2MQlnziZPSzTrJA.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*j4I2cKE2MQlnziZPSzTrJA.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*j4I2cKE2MQlnziZPSzTrJA.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*j4I2cKE2MQlnziZPSzTrJA.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*j4I2cKE2MQlnziZPSzTrJA.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"\/><img alt=\"\" class=\"bf lz ma c\" width=\"700\" height=\"313\" loading=\"lazy\" role=\"presentation\"\/><\/picture><\/div>\n<\/div><figcaption class=\"mb mc gj gh gi md me bd b be z dk\"><strong class=\"bd ko\">Fig 2. Indices based mostly on Time Buckets<\/strong><\/figcaption><\/figure>\n<p id=\"865f\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">For looking functions, we&#8217;ve got a single learn alias that factors to all indices created. When performing a question, we at all times execute it on the alias. This ensures that irrespective of the place paperwork are, all paperwork matching the question will probably be returned. For indexing\/updating paperwork, although, we can not use an alias, we use the precise index title to carry out index operations.<\/p>\n<p id=\"f6f3\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">To keep away from the ES question for the record of indices for each indexing request, we preserve the record of indices in a distributed cache. We refresh this cache at any time when a brand new index is created for the subsequent time bucket, in order that new property will probably be listed appropriately. For each asset indexing request, we have a look at the cache to find out the corresponding time bucket index for the asset. The cache shops all time-based indices in a sorted order (for simplicity we named our indices based mostly on their beginning time within the format yyyyMMddHHmmss) in order that we are able to simply decide precisely which index ought to be used for asset indexing based mostly on the asset creation time. Without utilizing the time bucket technique, the identical asset might have been listed into a number of indices as a result of Elasticsearch doc id is exclusive per index and never the cluster. Or we must carry out two API calls, first to determine the particular index after which to carry out the asset replace\/delete operation on that particular index.<\/p>\n<p id=\"8cf7\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">It remains to be doable to exceed 50GB in these older indices if hundreds of thousands of updates happen inside that point bucket index. To handle this difficulty, we added an API that might break up an previous index into two programmatically. In order to separate a given bucket T1 (which shops all property between t1 and t2) into two, we select a time t1.5 between t1 and t2, create a brand new bucket T1_5, and reindex all property created between t1.5 and t2 from T1 into this new bucket. While the reindexing is occurring, queries \/ reads are nonetheless answered by T1, so any new doc created (through asset updates) can be dual-written into T1 and T1.5, supplied that their timestamp falls between t1.5 and t2. Finally, as soon as the reindexing is full, we allow reads from T1_5, cease the twin write and delete reindexed paperwork from T1.<\/p>\n<p id=\"40fe\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">In truth, Elasticsearch gives an index rollover function to deal with the rising indicex drawback <a class=\"ae kl\" href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/6.0\/indices-rollover-index.html\" rel=\"noopener ugc nofollow\" target=\"_blank\">https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/6.0\/indices-rollover-index.html<\/a>. With this function, a brand new index is created when the present index measurement hits a threshold, and thru a write alias, the index calls will level to the brand new index created. That means, all future index calls would go to the brand new index created. However, this could create an issue for our replace circulation use case, as a result of we must question a number of indices to find out which index incorporates a selected doc in order that we are able to replace it appropriately. Because the calls to Elasticsearch will not be sequential, which means, an asset a1 created at T1 might be listed after one other asset a2 created at T2 the place T2&gt;T1, the older asset a1 can find yourself within the newer index whereas the newer asset a2 is endured within the previous index. In our present implementation, nevertheless, by merely trying on the asset id (and asset creation time), we are able to simply discover out which index to go to and it&#8217;s at all times deterministic.<\/p>\n<p id=\"729c\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">One factor to say is, Elasticsearch has a default restrict of 1000 fields per index. If we index every type to a single index, wouldn\u2019t we simply exceed this quantity? And what in regards to the information kind collisions we talked about above? Having a single index for all information varieties might probably trigger collisions when two asset varieties outline totally different information varieties for a similar area. We additionally modified our mapping technique to beat these points. Instead of making a separate Elasticsearch area for every metadata area outlined in an asset kind, we created a single <a class=\"ae kl\" href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/6.0\/nested.html\" rel=\"noopener ugc nofollow\" target=\"_blank\">nested<\/a> kind with a compulsory area known as `key`, which represents the title of the sphere on the asset kind, and a handful of data-type particular fields, reminiscent of: `string_value`, `long_value`, `date_value`, and so on. We would populate the corresponding data-type particular area based mostly on the precise information kind of the worth. Below you may see part of the index mapping outlined in our template, and an instance from a doc (asset) which has 4 metadata fields:<\/p>\n<figure class=\"lq lr ls lt gt lu gh gi paragraph-image\">\n<div role=\"button\" tabindex=\"0\" class=\"lv lw di lx bf ly\">\n<div class=\"gh gi mg\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" type=\"image\/webp\"\/><source data-testid=\"og\" srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*QkEOoJ9VcNLEJH_ksK7H6g.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"\/><img alt=\"\" class=\"bf lz ma c\" width=\"700\" height=\"803\" loading=\"lazy\" role=\"presentation\"\/><\/picture><\/div>\n<\/div><figcaption class=\"mb mc gj gh gi md me bd b be z dk\"><strong class=\"bd ko\">Fig 3. Snippet of the index mapping<\/strong><\/figcaption><\/figure>\n<figure class=\"lq lr ls lt gt lu gh gi paragraph-image\">\n<div role=\"button\" tabindex=\"0\" class=\"lv lw di lx bf ly\">\n<div class=\"gh gi mh\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" type=\"image\/webp\"\/><source data-testid=\"og\" srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*uIWtMJ0qsmhBW_KMBOhoLQ.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"\/><img alt=\"\" class=\"bf lz ma c\" width=\"700\" height=\"419\" loading=\"lazy\" role=\"presentation\"\/><\/picture><\/div>\n<\/div><figcaption class=\"mb mc gj gh gi md me bd b be z dk\"><strong class=\"bd ko\">Fig 4. Snippet of nested metadata area on a saved doc<\/strong><\/figcaption><\/figure>\n<p id=\"7819\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">As you see above, all asset properties go underneath the identical nested area `<strong class=\"jp ir\">metadata<\/strong>` with a compulsory `<strong class=\"jp ir\">key<\/strong>` area, and the corresponding data-type particular area. This ensures that irrespective of what number of asset varieties or properties are listed, we&#8217;d at all times have a set variety of fields outlined within the mapping. When trying to find these fields, as a substitute of querying for a single worth (cameraId == 42323243), we carry out a nested question the place we question for each key and the worth (key == cameraId AND long_value == 42323243). For extra data on nested queries, please seek advice from this <a class=\"ae kl\" href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/reference\/5.6\/query-dsl-nested-query.html\" rel=\"noopener ugc nofollow\" target=\"_blank\">hyperlink<\/a>.<\/p>\n<figure class=\"lq lr ls lt gt lu gh gi paragraph-image\">\n<div role=\"button\" tabindex=\"0\" class=\"lv lw di lx bf ly\">\n<div class=\"gh gi mh\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*KGLLQdbQ0T_yrAs6-8E52w.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*KGLLQdbQ0T_yrAs6-8E52w.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*KGLLQdbQ0T_yrAs6-8E52w.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*KGLLQdbQ0T_yrAs6-8E52w.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*KGLLQdbQ0T_yrAs6-8E52w.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*KGLLQdbQ0T_yrAs6-8E52w.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*KGLLQdbQ0T_yrAs6-8E52w.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" type=\"image\/webp\"\/><source data-testid=\"og\" srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*KGLLQdbQ0T_yrAs6-8E52w.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*KGLLQdbQ0T_yrAs6-8E52w.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*KGLLQdbQ0T_yrAs6-8E52w.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*KGLLQdbQ0T_yrAs6-8E52w.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*KGLLQdbQ0T_yrAs6-8E52w.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*KGLLQdbQ0T_yrAs6-8E52w.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*KGLLQdbQ0T_yrAs6-8E52w.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"\/><img alt=\"\" class=\"bf lz ma c\" width=\"700\" height=\"167\" loading=\"lazy\" role=\"presentation\"\/><\/picture><\/div>\n<\/div><figcaption class=\"mb mc gj gh gi md me bd b be z dk\"><strong class=\"bd ko\">Fig 5. Search\/Indexing RPS<\/strong><\/figcaption><\/figure>\n<p id=\"48df\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">After these adjustments, the indices we created at the moment are balanced by way of information measurement. CPU utilization is down from a mean of 70% to 10%. In addition, we&#8217;re capable of cut back the refresh interval time on these indices from our earlier setting 30 seconds to 1 sec to be able to help use instances like learn after write, which permits customers to go looking and get a doc after a second it was created<\/p>\n<figure class=\"lq lr ls lt gt lu gh gi paragraph-image\">\n<div role=\"button\" tabindex=\"0\" class=\"lv lw di lx bf ly\">\n<div class=\"gh gi mh\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*lKUZG-y1rtGZm14TyA5MtA.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*lKUZG-y1rtGZm14TyA5MtA.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*lKUZG-y1rtGZm14TyA5MtA.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*lKUZG-y1rtGZm14TyA5MtA.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*lKUZG-y1rtGZm14TyA5MtA.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*lKUZG-y1rtGZm14TyA5MtA.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*lKUZG-y1rtGZm14TyA5MtA.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" type=\"image\/webp\"\/><source data-testid=\"og\" srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*lKUZG-y1rtGZm14TyA5MtA.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*lKUZG-y1rtGZm14TyA5MtA.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*lKUZG-y1rtGZm14TyA5MtA.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*lKUZG-y1rtGZm14TyA5MtA.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*lKUZG-y1rtGZm14TyA5MtA.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*lKUZG-y1rtGZm14TyA5MtA.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*lKUZG-y1rtGZm14TyA5MtA.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"\/><img alt=\"\" class=\"bf lz ma c\" width=\"700\" height=\"321\" loading=\"lazy\" role=\"presentation\"\/><\/picture><\/div>\n<\/div><figcaption class=\"mb mc gj gh gi md me bd b be z dk\"><strong class=\"bd ko\">Fig 6. CPU Spike with Old indexing technique<\/strong><\/figcaption><\/figure>\n<figure class=\"lq lr ls lt gt lu gh gi paragraph-image\">\n<div role=\"button\" tabindex=\"0\" class=\"lv lw di lx bf ly\">\n<div class=\"gh gi mh\"><picture><source srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/format:webp\/1*ymOY_mRG303ZD_5ZdO3tog.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/format:webp\/1*ymOY_mRG303ZD_5ZdO3tog.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/format:webp\/1*ymOY_mRG303ZD_5ZdO3tog.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/format:webp\/1*ymOY_mRG303ZD_5ZdO3tog.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/format:webp\/1*ymOY_mRG303ZD_5ZdO3tog.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/format:webp\/1*ymOY_mRG303ZD_5ZdO3tog.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/format:webp\/1*ymOY_mRG303ZD_5ZdO3tog.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\" type=\"image\/webp\"\/><source data-testid=\"og\" srcset=\"https:\/\/miro.medium.com\/v2\/resize:fit:640\/1*ymOY_mRG303ZD_5ZdO3tog.png 640w, https:\/\/miro.medium.com\/v2\/resize:fit:720\/1*ymOY_mRG303ZD_5ZdO3tog.png 720w, https:\/\/miro.medium.com\/v2\/resize:fit:750\/1*ymOY_mRG303ZD_5ZdO3tog.png 750w, https:\/\/miro.medium.com\/v2\/resize:fit:786\/1*ymOY_mRG303ZD_5ZdO3tog.png 786w, https:\/\/miro.medium.com\/v2\/resize:fit:828\/1*ymOY_mRG303ZD_5ZdO3tog.png 828w, https:\/\/miro.medium.com\/v2\/resize:fit:1100\/1*ymOY_mRG303ZD_5ZdO3tog.png 1100w, https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*ymOY_mRG303ZD_5ZdO3tog.png 1400w\" sizes=\"(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px\"\/><img alt=\"\" class=\"bf lz ma c\" width=\"700\" height=\"264\" loading=\"lazy\" role=\"presentation\"\/><\/picture><\/div>\n<\/div><figcaption class=\"mb mc gj gh gi md me bd b be z dk\"><strong class=\"bd ko\">Fig 7. CPU Usage with New indexing technique<\/strong><\/figcaption><\/figure>\n<p id=\"ec79\" class=\"pw-post-body-paragraph jn jo iq jp b jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk ij bi\">We needed to do a one time migration of the present paperwork to the brand new indices. Thankfully we have already got a framework in place that may question all property from Cassandra and index them in Elasticsearch. Since doing full desk scans in Cassandra shouldn&#8217;t be typically beneficial on giant tables (attributable to potential timeouts), our cassandra schema incorporates a number of reverse indices that assist us question all information effectively. We additionally make the most of Kafka to course of these property asynchronously with out impacting our actual time site visitors. This infrastructure is used not solely to index property to Elasticsearch, but additionally to carry out administrative operations on all or some property, reminiscent of bulk updating property, scanning \/ fixing issues on them, and so on. Since we solely targeted on Elasticsearch indexing on this weblog, we&#8217;re planning to create one other weblog to speak about this infrastructure later.<\/p>\n<\/div>\n<p>[ad_2]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[ad_1] By Burak Bacioglu, Meenakshi Jindal At Netflix, all of our digital media property (photographs, movies, textual content, and so on.) are saved in safe storage layers. We constructed an asset administration platform (AMP), codenamed Amsterdam, to be able to simply set up and handle the metadata, schema, relations and permissions of those property. It [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":80714,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[37],"tags":[],"class_list":{"0":"post-80712","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-netflix"},"_links":{"self":[{"href":"https:\/\/showbizztoday.com\/index.php\/wp-json\/wp\/v2\/posts\/80712","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/showbizztoday.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/showbizztoday.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/showbizztoday.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/showbizztoday.com\/index.php\/wp-json\/wp\/v2\/comments?post=80712"}],"version-history":[{"count":0,"href":"https:\/\/showbizztoday.com\/index.php\/wp-json\/wp\/v2\/posts\/80712\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/showbizztoday.com\/index.php\/wp-json\/wp\/v2\/media\/80714"}],"wp:attachment":[{"href":"https:\/\/showbizztoday.com\/index.php\/wp-json\/wp\/v2\/media?parent=80712"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/showbizztoday.com\/index.php\/wp-json\/wp\/v2\/categories?post=80712"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/showbizztoday.com\/index.php\/wp-json\/wp\/v2\/tags?post=80712"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}