{"id":699,"date":"2016-08-01T23:38:09","date_gmt":"2016-08-01T20:38:09","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=699"},"modified":"2016-08-01T23:38:09","modified_gmt":"2016-08-01T20:38:09","slug":"elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/","title":{"rendered":"ElasticSearch Serisi 02 \u2013 C# ile Document Indexing ve Bulk Indexing"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p>Yeni bir ElasticSearch serisi ile merhaba arkada\u015flar.<\/p>\n<p>Bu serimizde sizlerle, <strong>Document Indexing<\/strong> ve <strong>Bulk Indexing<\/strong> gibi i\u015flemleri ger\u00e7ekle\u015ftirece\u011fiz. Bir \u00f6nceki serimiz olan &#8220;<em><a href=\"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\/\" target=\"_blank\">ElasticSearch Serisi 01 \u2013 C# ile Index Olu\u015fturmak<\/a><\/em>&#8221; adl\u0131 makalede, type bazl\u0131 nas\u0131l index olu\u015fturuldu\u011funu inceledik\u00a0ve bir ElasticSearch\u00a0projesi olu\u015fturmu\u015ftuk. Bu serimizde de ayn\u0131 proje \u00fczerinden ilerliyor olaca\u011f\u0131z.<\/p>\n<h3>1) Document Indexing<\/h3>\n<p><a href=\"\/wp-content\/uploads\/2016\/07\/elasticsearch-document-index.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-700 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/07\/elasticsearch-document-index.jpg\" alt=\"elasticsearch-document-index\" width=\"638\" height=\"479\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/elasticsearch-document-index.jpg 638w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/elasticsearch-document-index-300x225.jpg 300w\" data-sizes=\"(max-width: 638px) 100vw, 638px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 638px; --smush-placeholder-aspect-ratio: 638\/479;\" \/><\/a><\/p>\n<p><a href=\"https:\/\/gokhan-gokalp.com\/elasticsearche-baslarken-kurulum-kibana-marvel-ve-sense\/\" target=\"_blank\"><em>ElasticSearch\u2019e Ba\u015flarken (Kurulum, Kibana, Marvel ve Sense)<\/em><\/a> makalesinde de bahsetti\u011fimiz gibi ElasticSearch \u00fczerindeki Document&#8217;lar, RDBMS \u00fczerindeki Row&#8217;lara denk gelmektedir. Biz ise burada daha \u00f6nce type&#8217;\u0131na g\u00f6re olu\u015fturmu\u015f oldu\u011fumuz index&#8217;e, document&#8217;lar\u0131 ekleyece\u011fiz yani indexleyece\u011fiz.\u00a0Indexleme i\u015fleminde herhangi bir <em><strong>tokenizer<\/strong> <\/em>veya <em><strong>analyzer<\/strong> <\/em>kullanmayaca\u011f\u0131z.\u00a0Bu konfig\u00fcrasyon bilgilerine, gelecek\u00a0ElasticSearch serilerinde detayl\u0131 olarak de\u011finece\u011fiz.<\/p>\n<p>Hat\u0131rlarsak index olu\u015fturma gibi i\u015flemleri y\u00fcr\u00fctecek oldu\u011fumuz &#8220;IElasticContext&#8221; interface&#8217;ini implemente eden bir &#8220;ElasticContext&#8221; imiz vard\u0131. A\u015fa\u011f\u0131daki solution structure&#8217;\u0131 \u00fczerinden de\u00a0hat\u0131rlayabiliriz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/07\/elasticsearch-framework-solution-structure.jpg\"><img decoding=\"async\" class=\"wp-image-702 size-full aligncenter lazyload\" data-src=\"\/wp-content\/uploads\/2016\/07\/elasticsearch-framework-solution-structure.jpg\" alt=\"elasticsearch-framework-solution-structure\" width=\"301\" height=\"263\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/elasticsearch-framework-solution-structure.jpg 301w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/elasticsearch-framework-solution-structure-300x262.jpg 300w\" data-sizes=\"(max-width: 301px) 100vw, 301px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 301px; --smush-placeholder-aspect-ratio: 301\/263;\" \/><\/a>\u00a0Index&#8217;leme i\u015flemini de &#8220;ElasticContext&#8221; \u00fczerinden ger\u00e7ekle\u015ftirece\u011fiz. Bunun i\u00e7in \u00f6ncelikle &#8220;IElasticContext&#8221; interface&#8217;ini a\u00e7al\u0131m ve a\u015fa\u011f\u0131daki gibi yeni bir method imzas\u0131 tan\u0131mlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">namespace ElasticSearch.Data.Contracts\r\n{\r\n    public interface IElasticContext\r\n    {\r\n        IndexResponseDTO CreateIndex&lt;T&gt;(string indexName, string aliasName) where T : class;\r\n        IndexResponseDTO Index&lt;T&gt;(string indexName, T document) where T : class;\r\n    }\r\n}<\/pre>\n<p>Dikkat edersek &#8220;Index&lt;T&gt;&#8221; isminde generic olarak yeni bir method tan\u0131mlad\u0131k. Parametrelerinde ise &#8220;indexName&#8221; ve &#8220;T&#8221; tipinde bir document almaktad\u0131r. Projemizi geli\u015ftirirken abstraction&#8217;lardan\u00a0ve generic type&#8217;lardan yararlanarak\u00a0<strong>open-closed<\/strong> prensibine g\u00f6re geli\u015ftirdi\u011fimiz i\u00e7in, istedi\u011fimiz \u00f6l\u00e7\u00fcde class&#8217;lar\u0131m\u0131z\u0131 extend edebilmekteyiz.<\/p>\n<p>Interface&#8217;e method imzas\u0131n\u0131 ekledi\u011fimize g\u00f6re \u015fimdi &#8220;ElasticContext&#8221; class&#8217;\u0131 i\u00e7erisinde yeni method&#8217;u implemente edebiliriz.<\/p>\n<pre class=\"lang:c# decode:true \">public IndexResponseDTO Index&lt;T&gt;(string indexName, T document) where T : class\r\n{\r\n    var response = _elasticClient.Index(document, i =&gt; i\r\n                   .Index(indexName)\r\n                   .Type&lt;T&gt;());\r\n\r\n    return new IndexResponseDTO()\r\n    {\r\n        IsValid = response.IsValid,\r\n        StatusMessage = response.DebugInformation,\r\n        Exception = response.OriginalException\r\n    };\r\n}<\/pre>\n<p>Index method&#8217;u &#8220;_elasticClient&#8221; \u00fczerindeki &#8220;Index&#8221; method&#8217;unu kullanarak indexing i\u015flemlerini ger\u00e7ekle\u015ftirmektedir. Bu i\u015flemler s\u0131ras\u0131nda parametre olarak &#8220;document&#8221; ve\u00a0bir adet\u00a0function almaktad\u0131r. Bu function&#8217;\u0131 fluent bir \u015fekilde kullanarak, ilgili document&#8217;i hangi index&#8217;e at\u0131laca\u011f\u0131 ve type&#8217;\u0131n\u0131n ne oldu\u011funu s\u00f6yl\u00fcyoruz &#8220;_elasticClient&#8221; a. Bir \u00f6nceki seriden hat\u0131rlarsak &#8220;Product&#8221; entity&#8217;si &#8220;Id&#8221; property&#8217;sine sahipti. NEST k\u00fct\u00fcphanesi document \u00fczerindeki bu &#8220;Id&#8221; parametresini otomatik bir \u015fekilde\u00a0map&#8217;leyerek, elastic\u00a0i\u00e7erisine indexlemektedir. E\u011fer &#8220;Id&#8221; property&#8217;si farkl\u0131 bir isimde olsayd\u0131, ilgili function \u00fczerinden yine fluent bir \u015fekilde &#8220;Id()&#8221; method&#8217;unu \u00e7a\u011f\u0131rarak hangi property&#8217;nin &#8220;Id&#8221; olarak kullan\u0131laca\u011f\u0131n\u0131\u00a0s\u00f6yleyebilirdik.<\/p>\n<blockquote><p><strong>Not<\/strong>: Indexing s\u0131ras\u0131nda\u00a0spesifik olarak herhangi bir &#8220;id&#8221; property&#8217;si belirtmez isek, ElasticSearch bizim i\u00e7in kendisi 20 karakter uzunlu\u011funda bir Base64-encoded GUID string tipinde\u00a0bir &#8220;id&#8221; atamaktad\u0131r. Detaylara <a href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/guide\/current\/index-doc.html#_autogenerating_ids\" target=\"_blank\"><em>buradan<\/em> <\/a>eri\u015febilirsiniz.<\/p><\/blockquote>\n<p>&#8220;Index&#8221; method&#8217;unu &#8220;ElasticContext&#8221; class&#8217;\u0131na ekledikten sonra, class&#8217;\u0131n son hali a\u015fa\u011f\u0131daki \u015fekilde olacakt\u0131r.<\/p>\n<pre class=\"lang:c# decode:true \">using ElasticSearch.Data.Contracts;\r\nusing Nest;\r\n\r\nnamespace ElasticSearch.Data\r\n{\r\n    public class ElasticContext : IElasticContext\r\n    {\r\n        private readonly ElasticClient _elasticClient;\r\n\r\n        public ElasticContext(ElasticClient elasticClient)\r\n        {\r\n            _elasticClient = elasticClient;\r\n        }\r\n\r\n        #region IElasticContext Members\r\n        public IndexResponseDTO CreateIndex&lt;T&gt;(string indexName, string aliasName) where T : class\r\n        {\r\n            var createIndexDescriptor = new CreateIndexDescriptor(indexName)\r\n            .Mappings(ms =&gt; ms\r\n                            .Map&lt;T&gt;(m =&gt; m.AutoMap())\r\n                     )\r\n             .Aliases(a =&gt; a.Alias(aliasName));\r\n\r\n            var response = _elasticClient.CreateIndex(createIndexDescriptor);\r\n\r\n            return new IndexResponseDTO()\r\n            {\r\n                IsValid = response.IsValid,\r\n                StatusMessage = response.DebugInformation,\r\n                Exception = response.OriginalException\r\n            };\r\n        }\r\n\r\n        public IndexResponseDTO Index&lt;T&gt;(string indexName, T document) where T : class\r\n        {\r\n            var response = _elasticClient.Index(document, i =&gt; i\r\n                           .Index(indexName)\r\n                           .Type&lt;T&gt;());\r\n\r\n            return new IndexResponseDTO()\r\n            {\r\n                IsValid = response.IsValid,\r\n                StatusMessage = response.DebugInformation,\r\n                Exception = response.OriginalException\r\n            };\r\n        }\r\n        #endregion\r\n    }\r\n}<\/pre>\n<p>Index method&#8217;u \u015fuan haz\u0131r durumda. Dilerseniz &#8220;ElasticSearch.DataTransfer&#8221; namespace&#8217;i alt\u0131nda bulunan, console uygulamas\u0131ndan\u00a0hemen test edebiliriz. Bir \u00f6nceki seride hat\u0131rlarsak, console \u00fczerine index olu\u015fturma ile ilgili test kodlar\u0131n\u0131 yazm\u0131\u015ft\u0131k. Main method&#8217;u \u00fczerindeki index olu\u015fturma ile ilgili method&#8217;lar\u0131 sub method&#8217;lara b\u00f6lelim ve yeni i\u015flemimiz olan document indexleme kodlar\u0131n\u0131 yazal\u0131m.<\/p>\n<p>Bu i\u015flemler sonucunda ise &#8220;Program.cs&#8221; class&#8217;\u0131 a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<\/p>\n<pre class=\"lang:c# decode:true \">using System;\r\nusing ElasticSearch.Core.Common;\r\nusing ElasticSearch.Data;\r\nusing ElasticSearch.Data.Entities;\r\nusing Nest;\r\nusing System.Configuration;\r\n\r\nnamespace ElasticSearch.DataTransfer\r\n{\r\n    class Program\r\n    {\r\n        static void Main(string[] args)\r\n        {\r\n            string indexName = ConfigurationManager.AppSettings[\"ElasticSearchIndexName\"];\r\n\r\n            var elasticClient = new ElasticClient(ElasticHelper.Instance.GetConnectionSettings());\r\n            var elasticContext = new ElasticContext(elasticClient);\r\n\r\n            \/\/CreateIndex(elasticContext, indexName);\r\n\r\n            Index(elasticContext, indexName);\r\n\r\n            Console.ReadKey();\r\n        }\r\n\r\n        private static void Index(ElasticContext elasticContext, string indexName)\r\n        {\r\n            var response = elasticContext.Index(indexName, new Product()\r\n            {\r\n                Id = 5,\r\n                Name = \"Iphone 6s Plus\",\r\n                Description = \"64gb Iphone 6s Plus, Renk: Space Gray\",\r\n                Price = 4000\r\n            });\r\n\r\n            Console.WriteLine(response.StatusMessage);\r\n        }\r\n\r\n        private static void CreateIndex(ElasticContext elasticContext, string indexName)\r\n        {\r\n            indexName = string.Concat(indexName, \"_\", DateTime.Now.ToString(\"yyyyMMddHHss\"));\r\n            string aliasName = ConfigurationManager.AppSettings[\"ElasticSearchIndexName\"];\r\n\r\n            var response = elasticContext.CreateIndex&lt;Product&gt;(indexName, aliasName);\r\n\r\n            Console.WriteLine(response.StatusMessage);\r\n        }\r\n    }\r\n}<\/pre>\n<p>Burada dikkat edersek &#8220;CreateIndex&#8221; method&#8217;unu sub method olarak ay\u0131rd\u0131k ve i\u00e7erisinde ihtiya\u00e7 duyabilece\u011fi de\u011fi\u015fkenleri tan\u0131mlad\u0131k. Global olarak kullanacak oldu\u011fumuz de\u011fi\u015fkenler ise, Main method&#8217;u i\u00e7erisinde kald\u0131. Bir di\u011fer method&#8217;umuz olan &#8220;Index&#8221; method&#8217;unda ise, elasticContext \u00fczerine yeni implemente etti\u011fimiz &#8220;Index&#8221; method&#8217;unu \u00e7a\u011f\u0131r\u0131yoruz ve parametre olarak &#8220;indexName&#8221; ve yeni bir Product nesnesi veriyoruz. Bu i\u015flem sonucunda ilgili Product nesnesi elastic \u00fczerine NEST vas\u0131tas\u0131yla indexlenecek\u00a0ve sonucu console \u00fczerine yaz\u0131lacakt\u0131r.<\/p>\n<p>Dilerseniz console uygulamas\u0131n\u0131 ba\u015flatal\u0131m ve sonucuna bir bakal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/07\/elastic-valid-response.jpg\"><img decoding=\"async\" class=\"size-full wp-image-708 aligncenter lazyload\" data-src=\"\/wp-content\/uploads\/2016\/07\/elastic-valid-response.jpg\" alt=\"elastic-valid-response\" width=\"499\" height=\"204\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/elastic-valid-response.jpg 499w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/elastic-valid-response-300x123.jpg 300w\" data-sizes=\"(max-width: 499px) 100vw, 499px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 499px; --smush-placeholder-aspect-ratio: 499\/204;\" \/><\/a><\/p>\n<p>Indexleme i\u015flemimizin ba\u015far\u0131l\u0131 bir \u015fekilde ger\u00e7ekle\u015fti\u011fini &#8220;Valid NEST response built from a successful low call&#8221; c\u00fcmlesinden anlayabiliyoruz.\u00a0Product nesnesini\u00a0Sense \u00fczerinden kontrol etti\u011fimizde ise:<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/07\/elastic-index-sense.jpg\"><img decoding=\"async\" class=\"size-full wp-image-709 aligncenter lazyload\" data-src=\"\/wp-content\/uploads\/2016\/07\/elastic-index-sense.jpg\" alt=\"elastic-index-sense\" width=\"879\" height=\"653\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/elastic-index-sense.jpg 879w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/elastic-index-sense-300x223.jpg 300w\" data-sizes=\"(max-width: 879px) 100vw, 879px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 879px; --smush-placeholder-aspect-ratio: 879\/653;\" \/><\/a><\/p>\n<p>&#8220;1&#8221; numaral\u0131 Id ile indexlendi\u011fini g\u00f6rebilmekteyiz. Indexleme\u00a0i\u015flemi \u015fimdilik bu kadard\u0131r.<\/p>\n<p>&#8220;ElasticContext&#8221; art\u0131k hem verilen tipe g\u00f6re yeni bir index olu\u015fturabilme yetisine,\u00a0hemde ilgili document&#8217;\u0131 istenilen index \u00fczerine indexleyebilme yetisine sahip olmu\u015ftur.<\/p>\n<blockquote><p><strong>Not<\/strong>: Sense \u00fczerinden &#8220;<em>GET product_search\/product\/_search<\/em>&#8221; komutu ile product&#8217;lar\u0131 listeletebildi\u011fimiz gibi &#8220;<em>GET product_search\/product\/{id}<\/em>&#8221; komutu ile de, istenilen &#8220;id&#8221; li \u00fcr\u00fcn girildi\u011finde o \u00fcr\u00fcne ait\u00a0detaylar \u00e7ekilebilmektedir.<\/p><\/blockquote>\n<h3>1) Bulk Document Indexing<\/h3>\n<p>T\u0131pk\u0131 Document Indexing \u00f6zelli\u011fini ekledi\u011fimiz gibi \u015fimdide, Bulk Indexing yapabilmesi i\u00e7in ilgili method imzas\u0131n\u0131 tan\u0131mlay\u0131p implemente etmeye ba\u015flayaca\u011f\u0131z.<\/p>\n<p>&#8220;IElasticContext&#8221; interface&#8217;ini a\u015fa\u011f\u0131daki gibi geni\u015fletelim.<\/p>\n<pre class=\"lang:c# decode:true \">using System.Collections.Generic;\r\n\r\nnamespace ElasticSearch.Data.Contracts\r\n{\r\n    public interface IElasticContext\r\n    {\r\n        IndexResponseDTO CreateIndex&lt;T&gt;(string indexName, string aliasName) where T : class;\r\n        IndexResponseDTO Index&lt;T&gt;(string indexName, T document) where T : class;\r\n        IndexResponseDTO BulkIndex&lt;T&gt;(string indexName, List&lt;T&gt; document) where T : class;\r\n    }\r\n}<\/pre>\n<p>Eklemi\u015f oldu\u011fumuz &#8220;BulkIndex&#8221; generic method imzas\u0131 ile ilgili bulking i\u015flemlerini ger\u00e7ekle\u015ftiriyor olaca\u011f\u0131z. Bu sefer art\u0131k T tipinde bir document yerine, List of T almaktad\u0131r. &#8220;ElasticContext&#8221; class&#8217;\u0131na gelelim ve yeni eklemi\u015f oldu\u011fumuz method imzas\u0131n\u0131, a\u015fa\u011f\u0131daki gibi implemente etmeye ba\u015flayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true \">using System;\r\nusing System.Collections.Generic;\r\nusing ElasticSearch.Data.Contracts;\r\nusing Nest;\r\n\r\nnamespace ElasticSearch.Data\r\n{\r\n    public class ElasticContext : IElasticContext\r\n    {\r\n        private readonly ElasticClient _elasticClient;\r\n\r\n        public ElasticContext(ElasticClient elasticClient)\r\n        {\r\n            _elasticClient = elasticClient;\r\n        }\r\n\r\n        #region IElasticContext Members\r\n        public IndexResponseDTO CreateIndex&lt;T&gt;(string indexName, string aliasName) where T : class\r\n        {\r\n            var createIndexDescriptor = new CreateIndexDescriptor(indexName)\r\n            .Mappings(ms =&gt; ms\r\n                            .Map&lt;T&gt;(m =&gt; m.AutoMap())\r\n                     )\r\n             .Aliases(a =&gt; a.Alias(aliasName));\r\n\r\n            var response = _elasticClient.CreateIndex(createIndexDescriptor);\r\n\r\n            return new IndexResponseDTO()\r\n            {\r\n                IsValid = response.IsValid,\r\n                StatusMessage = response.DebugInformation,\r\n                Exception = response.OriginalException\r\n            };\r\n        }\r\n\r\n        public IndexResponseDTO Index&lt;T&gt;(string indexName, T document) where T : class\r\n        {\r\n            var response = _elasticClient.Index(document, i =&gt; i\r\n                           .Index(indexName)\r\n                           .Type&lt;T&gt;());\r\n\r\n            return new IndexResponseDTO()\r\n            {\r\n                IsValid = response.IsValid,\r\n                StatusMessage = response.DebugInformation,\r\n                Exception = response.OriginalException\r\n            };\r\n        }\r\n\r\n        public IndexResponseDTO BulkIndex&lt;T&gt;(string indexName, List&lt;T&gt; document) where T : class\r\n        {\r\n            var response = _elasticClient.IndexMany(document, indexName);\r\n\r\n            return new IndexResponseDTO()\r\n            {\r\n                IsValid = response.IsValid,\r\n                StatusMessage = response.DebugInformation,\r\n                Exception = response.OriginalException\r\n            };\r\n        }\r\n        #endregion\r\n    }\r\n}<\/pre>\n<p>Implemente etmi\u015f oldu\u011fumuz &#8220;BulkIndex&#8221; method&#8217;u i\u00e7erisinde &#8220;_elasticClient&#8221;\u00a0\u00fczerindeki &#8220;IndexMany&#8221; method&#8217;unu call etmektedir. Bu method ise bulk i\u015flemler\u00a0i\u00e7in yaz\u0131lm\u0131\u015f shortcut bir method&#8217;dur.<\/p>\n<p>Context&#8217;i haz\u0131rlad\u0131ktan sonra \u015fimdi &#8220;Program.cs&#8221; i a\u015fa\u011f\u0131daki gibi g\u00fcncelleyelim ve debug i\u015flemini ba\u015flatal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true \">using System;\r\nusing System.Collections.Generic;\r\nusing ElasticSearch.Core.Common;\r\nusing ElasticSearch.Data;\r\nusing ElasticSearch.Data.Entities;\r\nusing Nest;\r\nusing System.Configuration;\r\n\r\nnamespace ElasticSearch.DataTransfer\r\n{\r\n    class Program\r\n    {\r\n        static void Main(string[] args)\r\n        {\r\n            string indexName = ConfigurationManager.AppSettings[\"ElasticSearchIndexName\"];\r\n\r\n            var elasticClient = new ElasticClient(ElasticHelper.Instance.GetConnectionSettings());\r\n            var elasticContext = new ElasticContext(elasticClient);\r\n\r\n            \/\/CreateIndex(elasticContext, indexName);\r\n\r\n            \/\/Index(elasticContext, indexName);\r\n\r\n            BulkIndex(elasticContext, indexName);\r\n\r\n            Console.ReadKey();\r\n        }\r\n\r\n        private static void BulkIndex(ElasticContext elasticContext, string indexName)\r\n        {\r\n            var response = elasticContext.BulkIndex(indexName, new List&lt;Product&gt;()\r\n            {\r\n                new Product()\r\n                {\r\n                    Id = 1,\r\n                    Name = \"Iphone 6s Plus\",\r\n                    Description = \"64gb Iphone 6s Plus, Renk: Space Gray\",\r\n                    Price = 5000\r\n                },\r\n                new Product()\r\n                {\r\n                    Id = 2,\r\n                    Name = \"Sony Xperia Z Ultra\",\r\n                    Description = \"Full HD ekran, Renk: Siyah\",\r\n                    Price = 1200\r\n                },\r\n                new Product()\r\n                {\r\n                    Id = 3,\r\n                    Name = \"Samsung Galaxy S7 Edge\",\r\n                    Description = \"Amelod ekran, Renk: Beyaz\",\r\n                    Price = 2800\r\n                }\r\n            });\r\n\r\n            Console.WriteLine(response.StatusMessage);\r\n        }\r\n\r\n        private static void Index(ElasticContext elasticContext, string indexName)\r\n        {\r\n            var response = elasticContext.Index(indexName, new Product()\r\n            {\r\n                Id = 1,\r\n                Name = \"Iphone 6s Plus\",\r\n                Description = \"64gb Iphone 6s Plus, Renk: Space Gray\",\r\n                Price = 4000\r\n            });\r\n\r\n            Console.WriteLine(response.StatusMessage);\r\n        }\r\n\r\n        private static void CreateIndex(ElasticContext elasticContext, string indexName)\r\n        {\r\n            indexName = string.Concat(indexName, \"_\", DateTime.Now.ToString(\"yyyyMMddHHss\"));\r\n            string aliasName = ConfigurationManager.AppSettings[\"ElasticSearchIndexName\"];\r\n\r\n            var response = elasticContext.CreateIndex&lt;Product&gt;(indexName, aliasName);\r\n\r\n            Console.WriteLine(response.StatusMessage);\r\n        }\r\n    }\r\n}<\/pre>\n<p>&#8220;Main&#8221; method&#8217;u i\u00e7erisinde di\u011fer method&#8217;lar\u0131 kapatt\u0131k ve sadece yeni eklemi\u015f oldu\u011fumuz &#8220;BulkIndex&#8221; method&#8217;unu \u00e7a\u011f\u0131r\u0131yoruz. Burada 3 farkl\u0131 \u00fcr\u00fcn&#8217;\u00fc, list of Product tipinde &#8220;elasticContext&#8221; \u00fczerine eklemi\u015f oldu\u011fumuz &#8220;BulkIndex&#8221;method&#8217;una g\u00f6nderiyoruz.<\/p>\n<p>Console uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra Sense \u00fczerinden bir search query&#8217;si atal\u0131m ve i\u015flem sonucuna bir bakal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/08\/elasticsearch-bulk-index.jpg\"><img decoding=\"async\" class=\"size-full wp-image-712 aligncenter lazyload\" data-src=\"\/wp-content\/uploads\/2016\/08\/elasticsearch-bulk-index.jpg\" alt=\"elasticsearch-bulk-index\" width=\"1086\" height=\"853\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/elasticsearch-bulk-index.jpg 1086w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/elasticsearch-bulk-index-300x236.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/08\/elasticsearch-bulk-index-1024x804.jpg 1024w\" data-sizes=\"(max-width: 1086px) 100vw, 1086px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1086px; --smush-placeholder-aspect-ratio: 1086\/853;\" \/><\/a><\/p>\n<p>Response k\u0131sm\u0131ndaki se\u00e7ili alana bakt\u0131\u011f\u0131m\u0131zda ekledi\u011fimiz 3 adet product&#8217;\u0131n ba\u015far\u0131l\u0131 bir \u015fekilde indexlendi\u011fini g\u00f6rebilmekteyiz. Burada bir noktaya dikkatinizi \u00e7ekmek istiyorum.\u00a0Makalenin giri\u015f k\u0131s\u0131mlar\u0131nda zaten &#8220;1&#8221; numaral\u0131 Id&#8217;ye sahip olan &#8220;Iphone 6s Plus&#8221; product&#8217;\u0131n\u0131 &#8220;4000&#8221; price&#8217;a sahip olacak \u015fekilde eklemi\u015ftik. Fakat bulk i\u015flemimiz s\u0131ras\u0131nda ise, ayn\u0131 \u00fcr\u00fcn\u00fc ayn\u0131 Id ile sadece price bilgisini &#8220;5000&#8221; olarak g\u00f6nderdik. ElasticSearch burada\u00a0otomatik olarak ilgili <em>Type<\/em> ve <em>Id<\/em>&#8216;ye sahip dok\u00fcman i\u00e7in, <strong>Update<\/strong>\u00a0i\u015flemi ger\u00e7ekle\u015ftirdi.<\/p>\n<p>ElasticSearch burada bizi bir y\u00fckten daha kurtar\u0131yor. E\u011fer ilgili dok\u00fcman zaten mevcut ise ayn\u0131 <em>Type<\/em> ve <em>Id<\/em>\u00a0ile, update i\u015flemini kendisi ger\u00e7ekle\u015ftiriyor. Bu sayede update i\u015flemi\u00a0i\u00e7in herhangi bir efor harcamam\u0131z gerekmiyor.<\/p>\n<p>Bir elastic serisinin daha sonuna geldik. Geli\u015ftiriyor\u00a0oldu\u011fumuz bu yap\u0131n\u0131n, faydal\u0131 olmas\u0131n\u0131 temenni ederim.<\/p>\n<p>Projenin g\u00fcncel haline, ekten ula\u015fabilirsiniz.<\/p>\n<p>Takipte kal\u0131n.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/08\/ElasticSearch-Index-BulkIndex.rar\">ElasticSearch-Index-BulkIndex<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Yeni bir ElasticSearch serisi ile merhaba arkada\u015flar. Bu serimizde sizlerle, Document Indexing ve Bulk Indexing gibi i\u015flemleri ger\u00e7ekle\u015ftirece\u011fiz. Bir \u00f6nceki serimiz olan &#8220;ElasticSearch Serisi 01 \u2013 C# ile Index Olu\u015fturmak&#8221; adl\u0131 makalede, type bazl\u0131 nas\u0131l index olu\u015fturuldu\u011funu inceledik\u00a0ve bir ElasticSearch\u00a0projesi olu\u015fturmu\u015ftuk. Bu serimizde de&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">ElasticSearch Serisi 02 \u2013 C# ile Document Indexing ve Bulk Indexing<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[193],"tags":[214,213,215,211,212,200,217,216],"class_list":["post-699","post","type-post","status-publish","format-standard","hentry","category-search-engine","tag-c-elastic-search","tag-c-elasticsearch-bulk-index","tag-c-elasticsearch-update","tag-c-ile-elasticsearch-index","tag-elasticsearch-ile-bulk-index","tag-elasticsearch-index","tag-elasticsearch-nest","tag-elasticsearch-nest-kullanimi","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":false,"content":false,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>ElasticSearch Serisi 02 \u2013 C# ile Document Indexing ve Bulk Indexing - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ElasticSearch Serisi 02 \u2013 C# ile Document Indexing ve Bulk Indexing - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2016-08-01T20:38:09+00:00\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"ElasticSearch Serisi 02 \u2013 C# ile Document Indexing ve Bulk Indexing\",\"datePublished\":\"2016-08-01T20:38:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\\\/\"},\"wordCount\":1114,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"keywords\":[\"c# elastic search\",\"c# elasticsearch bulk index\",\"c# elasticsearch update\",\"c# ile elasticsearch index\",\"elasticsearch ile bulk index\",\"elasticsearch index\",\"elasticsearch nest\",\"elasticsearch nest kullan\u0131m\u0131\"],\"articleSection\":[\"Search Engine\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\\\/\",\"name\":\"ElasticSearch Serisi 02 \u2013 C# ile Document Indexing ve Bulk Indexing - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"datePublished\":\"2016-08-01T20:38:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ElasticSearch Serisi 02 \u2013 C# ile Document Indexing ve Bulk Indexing\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ElasticSearch Serisi 02 \u2013 C# ile Document Indexing ve Bulk Indexing - G\u00f6khan G\u00f6kalp","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:\/\/gokhan-gokalp.com\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/","og_locale":"tr_TR","og_type":"article","og_title":"ElasticSearch Serisi 02 \u2013 C# ile Document Indexing ve Bulk Indexing - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2016-08-01T20:38:09+00:00","author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"9 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"ElasticSearch Serisi 02 \u2013 C# ile Document Indexing ve Bulk Indexing","datePublished":"2016-08-01T20:38:09+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/"},"wordCount":1114,"commentCount":4,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"keywords":["c# elastic search","c# elasticsearch bulk index","c# elasticsearch update","c# ile elasticsearch index","elasticsearch ile bulk index","elasticsearch index","elasticsearch nest","elasticsearch nest kullan\u0131m\u0131"],"articleSection":["Search Engine"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/","url":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/","name":"ElasticSearch Serisi 02 \u2013 C# ile Document Indexing ve Bulk Indexing - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"datePublished":"2016-08-01T20:38:09+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-02-c-ile-document-indexing-ve-bulk-indexing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"ElasticSearch Serisi 02 \u2013 C# ile Document Indexing ve Bulk Indexing"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/699","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=699"}],"version-history":[{"count":9,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/699\/revisions"}],"predecessor-version":[{"id":714,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/699\/revisions\/714"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=699"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=699"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}