{"id":684,"date":"2016-07-24T23:42:38","date_gmt":"2016-07-24T20:42:38","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=684"},"modified":"2016-07-24T23:49:46","modified_gmt":"2016-07-24T20:49:46","slug":"elasticsearch-serisi-01-csharp-ile-index-olusturmak","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\/","title":{"rendered":"ElasticSearch Serisi 01 &#8211; C# ile Index Olu\u015fturmak"},"content":{"rendered":"<p>Merhaba arkada\u015flar.<\/p>\n<p>Hat\u0131rlarsak bir \u00f6nceki makalem olan &#8220;<a href=\"https:\/\/gokhan-gokalp.com\/elasticsearche-baslarken-kurulum-kibana-marvel-ve-sense\/\" target=\"_blank\">ElasticSearch\u2019e Ba\u015flarken (Kurulum, Kibana, Marvel ve Sense)<\/a>&#8221; ile asl\u0131nda ElasticSearch d\u00fcnyas\u0131na bir ad\u0131m atm\u0131\u015ft\u0131k. Bu makale kapsam\u0131nda ise C# \u00fczerinde ElasticSearch i\u00e7in kullanacak oldu\u011fumuz <strong>NEST<\/strong>\u00a0k\u00fct\u00fcphanesini\u00a0tan\u0131yaca\u011f\u0131z ve hemen ard\u0131ndan bir index olu\u015fturaca\u011f\u0131z.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/07\/elasticsearch-nest.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-696 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/07\/elasticsearch-nest.png\" alt=\"elasticsearch-nest\" width=\"1500\" height=\"480\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/elasticsearch-nest.png 1500w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/elasticsearch-nest-300x96.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/elasticsearch-nest-1024x328.png 1024w\" data-sizes=\"(max-width: 1500px) 100vw, 1500px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1500px; --smush-placeholder-aspect-ratio: 1500\/480;\" \/><\/a><\/p>\n<p>Dilerseniz \u00f6ncelikle biraz NEST k\u00fct\u00fcphanesinden\u00a0bahsedelim.<\/p>\n<blockquote><p>NEST: ElasticSearch&#8217;e ba\u011flant\u0131 kurabilmemizi, indexleme ve sorgulama gibi i\u015flemleri yapabilmemizi sa\u011flayan ve ayn\u0131 zamanda\u00a0strongly typed ve fluent request&#8217;ler olu\u015fturabilmemize imkan tan\u0131yan bir k\u00fct\u00fcphanedir.<\/p><\/blockquote>\n<p>NEST hakk\u0131nda detayl\u0131 bilgilere eri\u015fmek isterseniz\u00a0<a href=\"https:\/\/www.elastic.co\/guide\/en\/elasticsearch\/client\/net-api\/current\/nest.html\" target=\"_blank\">buradan<\/a>\u00a0inceleyebilirsiniz.\u00a0ElasticSearch makale serilerimiz boyunca NEST k\u00fct\u00fcphanesini kullan\u0131yor ve tan\u0131yor olaca\u011f\u0131z.<\/p>\n<p>Kodlamaya ba\u015flayabilmek i\u00e7in &#8220;ElasticSearch&#8221; isminde bir Blank Solution olu\u015fturuyorum. ElasticSearch makale serisi boyunca bu solution alt\u0131ndan ilerlemeyi d\u00fc\u015f\u00fcn\u00fcyorum. Olu\u015fturmu\u015f oldu\u011fumuz solution&#8217;a, &#8220;ElasticSearch.Core.Common&#8221; ismine sahip bir Class Library ekleyelim. Bu Library i\u00e7erisinde\u00a0ihtiya\u00e7 duyaca\u011f\u0131m\u0131z ortak noktalar\u0131 toplayaca\u011f\u0131z. Bu i\u015flemin ard\u0131ndan Nuget Package Manager&#8217;a girerek, &#8220;ElasticSearch.Core.Common&#8221; projesine a\u015fa\u011f\u0131daki NEST k\u00fct\u00fcphanesini kural\u0131m.<\/p>\n<p>Kurulum i\u015flemlerinin ard\u0131ndan, &#8220;ElasticHelper&#8221; isminde bir class ekleyelim ve i\u00e7erisini a\u015fa\u011f\u0131daki gibi kodlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">using System;\r\nusing System.Configuration;\r\nusing Nest;\r\n\r\nnamespace ElasticSearch.Core.Common\r\n{\r\n    public class ElasticHelper\r\n    {\r\n        private static readonly Lazy&lt;ElasticHelper&gt; _Instance = new Lazy&lt;ElasticHelper&gt;(() =&gt; new ElasticHelper());\r\n\r\n        private ElasticHelper()\r\n        {\r\n\r\n        }\r\n\r\n        public static ElasticHelper Instance\r\n        {\r\n            get\r\n            {\r\n                return _Instance.Value;\r\n            }\r\n        }\r\n\r\n        #region Public Methods\r\n        public ConnectionSettings GetConnectionSettings()\r\n        {\r\n            var connectionSettings = new ConnectionSettings(new Uri(ConfigurationManager.AppSettings[\"ElasticSearchURI\"]));\r\n\r\n            return connectionSettings;\r\n        }\r\n        #endregion\r\n    }\r\n}<\/pre>\n<p>ElasticHelper s\u0131n\u0131f\u0131 i\u00e7erisinde,\u00a0ihtiya\u00e7 duyabile\u011fimiz yard\u0131mc\u0131 niteli\u011findeki method&#8217;lar\u0131m\u0131z\u0131 kodlayaca\u011f\u0131z. \u00a0Burada <strong>Lazy\u00a0<\/strong>class&#8217;\u0131ndan faydalanarak ilgili helper&#8217;\u0131m\u0131z\u0131n tek bir instance&#8217;a sahip olmas\u0131n\u0131 sa\u011flad\u0131k. &#8220;GetConnectionSettings&#8221; method&#8217;unda ise, ElasticSearch&#8217;\u00fcn Client objesini yaratabilmemiz i\u00e7in ihtiya\u00e7 duydu\u011fu &#8220;ConnectionSettings&#8221; tipindeki instance&#8217;\u0131n\u0131\u00a0yarat\u0131p geriye d\u00f6n\u00fcyoruz. Instance yaratma i\u015flemi s\u0131ras\u0131nda ihtiya\u00e7 duydu\u011fu Elastic URI&#8217;\u0131n\u0131 ise, &#8220;System.Configuration&#8221; namespace&#8217;i alt\u0131nda bulunan &#8220;ConfigurationManager&#8221; arac\u0131l\u0131\u011f\u0131 ile &#8220;AppSettings&#8221; \u00fczerinden veriyoruz.<\/p>\n<p>\u015eimdi\u00a0domain\u00a0entity&#8217;lerini tan\u0131mlamaya giri\u015f yapabiliriz.\u00a0Bunun\u00a0i\u00e7in bir Entity katman\u0131 olu\u015fturaca\u011f\u0131z.\u00a0&#8220;ElasticSearch.Data.Entities&#8221; isminde bir Class Library ekleyelim. Bu Library i\u00e7erisinde bahsetti\u011fimiz gibi elastic i\u00e7erisine index&#8217;leyecek oldu\u011fumuz domin entity&#8217;leri yer alacak. Library&#8217;i ekleme\u00a0i\u015fleminden sonra &#8220;Product&#8221; isminde ilk entity&#8217;mizi olu\u015ftural\u0131m. Bu entity a\u015fa\u011f\u0131daki gibi property&#8217;lere sahip olacak.<\/p>\n<pre class=\"lang:c# decode:true\">namespace ElasticSearch.Data.Entities\r\n{\r\n    public class Product\r\n    {\r\n        public int Id { get; set; }\r\n        public string Name { get; set; }\r\n        public string Description { get; set; }\r\n        public decimal Price { get; set; }\r\n    }\r\n}<\/pre>\n<p>Burada dikkat etmemiz gereken baz\u0131 \u00f6nemli noktalar bulunmakta. Elastic \u00fczerinde verilerimizi store ederken, ilgili dok\u00fcman\u0131n yan\u0131 entity&#8217;nin her property&#8217;sini <strong>index&#8217;lememeliyiz<\/strong>. ElasticSearch sadece <strong>search<\/strong> <strong>i\u015flemlerimizi<\/strong> h\u0131zl\u0131 bir \u015fekilde yapabilmemizi sa\u011flayan bir ara\u00e7t\u0131r, veritaban\u0131 de\u011fildir. Evet veritaban\u0131 olarak da\u00a0kullanabilirsiniz fakat bu i\u015flem sonucunda getirece\u011fi olumsuz etkilerle y\u00fczle\u015fmekte pek de ho\u015f olmayacakt\u0131r. \u00d6rnek vermek gerekirse, g\u00fcn ge\u00e7tik\u00e7e dok\u00fcman boyutlar\u0131n\u0131z artacak, search i\u015flemleri nispeten daha yava\u015f \u00e7al\u0131\u015fmaya ba\u015flayacak (ki i\u015fin i\u00e7ine aggregation&#8217;lar vb. girdik\u00e7e) ve verilerinizi\u00a0elastic&#8217;e aktar\u0131m s\u00fcreleriniz daha da uzayacakt\u0131r. B\u00fcy\u00fck\u00a0scale&#8217;e sahip ortamlarda i\u015fler git gide daha da zor olacakt\u0131r.<\/p>\n<p>Kodlamam\u0131za \u015fimdi\u00a0Resource Access i\u015flemlerini yani indexing i\u015flemlerini ger\u00e7ekle\u015ftirecek oldu\u011fumuz Data katman\u0131 ile devam edelim. Bunun i\u00e7in Solution&#8217;a &#8220;ElasticSearch.Data&#8221; olarak bir Class Library daha ekleyelim. Eklemi\u015f oldu\u011fumuz Data katman\u0131na yine Nuget Package Manager \u00fczerinden NEST k\u00fct\u00fcphanesini kural\u0131m. Hen\u00fcz i\u00e7erisine hi\u00e7 bir class eklemeden, &#8220;ElasticSearch.Data.Contracts&#8221; isminde bir Class Library ekleyelim ve i\u00e7erisine a\u015fa\u011f\u0131daki gibi &#8220;IElasticContext&#8221; isminde bir interface 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    }\r\n}<\/pre>\n<p>Bu interface ElasticContext&#8217;inin bar\u0131nd\u0131raca\u011f\u0131 method imzalar\u0131n\u0131 i\u00e7erecek. \u015eimdilik sadece &#8220;CreateIndex&#8221; method&#8217;u ile devam edece\u011fiz. Bu method elastic \u00fczerinde bir adet index yaratmam\u0131z\u0131 sa\u011flayacak. ElasticSearch&#8217;e giri\u015f makalesinde bahsetti\u011fimiz gibi index&#8217;ler, verilerimizin tutuldu\u011fu bir nevi veritaban\u0131d\u0131r. Bu sebeple herhangi bir dok\u00fcman eklemeden \u00f6nce bir index yaratmam\u0131z gerekmektedir.<\/p>\n<p>Interface&#8217;i olu\u015fturduktan sonra geri d\u00f6n\u00fc\u015f tipimiz olan &#8220;IndexResponseDTO&#8221; objesini de tan\u0131mlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">using System;\r\n\r\nnamespace ElasticSearch.Data.Contracts\r\n{\r\n    public class IndexResponseDTO\r\n    {\r\n        public bool IsValid { get; set; }\r\n        public string StatusMessage { get; set; }\r\n        public Exception Exception { get; set; }\r\n    }\r\n}<\/pre>\n<p>IndexResponseDTO ile de\u00a0olu\u015fturacak oldu\u011fumuz index sonu\u00e7lar\u0131n\u0131 geri d\u00f6n\u00fcyor olaca\u011f\u0131z.\u00a0\u015eimdi kald\u0131\u011f\u0131m\u0131z yerden devam edebiliriz ve olu\u015fturmu\u015f oldu\u011fumuz &#8220;ElasticSearch.Data&#8221; Library&#8217;sine &#8220;ElasticSearch.Data.Contracts&#8221; Library&#8217;sini Referans olarak g\u00f6sterip, i\u00e7erisine &#8220;ElasticContext&#8221; isminde yeni bir class olu\u015ftural\u0131m.<\/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        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}<\/pre>\n<p>ElasticContext class&#8217;\u0131nda constructor injection y\u00f6ntemi ile d\u0131\u015far\u0131dan bir adet &#8220;ElasticClient&#8221; al\u0131yoruz. &#8220;CreateIndex&lt;T&gt;&#8221; method&#8217;unda ise &#8220;CreateIndexDescriptor&#8221; yaratarak, i\u00e7erisinde fluently bir \u015fekilde &#8220;Mappings&#8221; ve &#8220;Aliases&#8221; tan\u0131mlamalar\u0131m\u0131z\u0131 yap\u0131yoruz. <strong>Mappings<\/strong> ile elastic \u00fczerinde verilerimizin\u00a0nas\u0131l tutulaca\u011f\u0131n\u0131 tan\u0131mlarken, <strong>Aliases<\/strong> sadece index&#8217;imizin takma ismidir. Yani sorgulama yaparken daha k\u0131sa bir isim \u00fczerinden ilgili index&#8217;e eri\u015febilmek i\u00e7indir.<\/p>\n<blockquote><p><strong>Not<\/strong>: Aliases&#8217;\u0131n bir ba\u015fka faydas\u0131 ise, production ortamlar\u0131nda bir index \u00fczerinde \u00e7al\u0131\u015f\u0131rken g\u00fcncelleme veya yeniden atma(reindex) gibi ihtiya\u00e7lar\u0131m\u0131z do\u011fdu\u011funda, production \u00fczerindeki index&#8217;i bozmadan farkl\u0131 bir index ismi ile veri ba\u015ftan at\u0131l\u0131r\/g\u00fcncellenir. Daha sonra sadece saniyeler i\u00e7erisinde ilgili <strong>alias<\/strong>\u00a0eski index \u00fczerinden\u00a0silinir, yeni at\u0131lan index&#8217;e verilir. Bu sebeple alias&#8217;lar <strong>unique<\/strong> olmal\u0131d\u0131r. Bu sayede hi\u00e7bir risk ve kesinti olmadan index de\u011fi\u015ftirebilmek m\u00fcmk\u00fcn olacakt\u0131r.<\/p><\/blockquote>\n<p>Daha sonra d\u0131\u015far\u0131dan inject etti\u011fimiz &#8220;_elasticClient&#8221; \u00fczerinden &#8220;CreateIndex&#8221; method&#8217;unu \u00e7a\u011f\u0131rarak, tan\u0131mlam\u0131\u015f oldu\u011fumuz &#8220;createIndexDescriptor&#8221;\u00fc parametre olarak set ediyoruz. Bu i\u015flemlerin ard\u0131ndan <strong>ElasticClient<\/strong> bizim i\u00e7in HTTP \u00fczerinden bir REST\u00a0\u00e7a\u011fr\u0131s\u0131\u00a0ger\u00e7ekle\u015ftirecek. REST\u00a0\u00e7a\u011fr\u0131s\u0131 sonucunda elde edece\u011fimiz\u00a0response&#8217;u ise, &#8220;IndexResponseDTO&#8221; objesine map ederek, geriye d\u00f6n\u00fcyoruz.<\/p>\n<p>\u015euan neredeyse haz\u0131r gibiyiz. Elastic&#8217;e verilerimizi aktar\u0131m i\u015flemlerimizi ger\u00e7ekle\u015ftirmek i\u00e7in ben bir adet Console Application se\u00e7iyorum. (On-Demand olarak \u00e7al\u0131\u015faca\u011f\u0131 i\u00e7in) Solution i\u00e7erisine &#8220;ElasticSearch.DataTransfer&#8221; isminde bir Console Application ekliyorum ve Referans olarak &#8220;ElasticSearch.Core.Common&#8221;, &#8220;ElasticSearch.Data.Contracts&#8221;, &#8220;ElasticSearch.Data.Entities&#8221; ve &#8220;ElasticSearch.Data&#8221; projelerini ekliyorum. Hemen Nuget Package Manager&#8217;\u0131 a\u00e7arak, NEST k\u00fct\u00fcphanesini buraya da y\u00fckl\u00fcyorum. Art\u0131k bu proje i\u00e7erisinde\u00a0<strong>index<\/strong>, <strong>reindex<\/strong> veya\u00a0<strong>dok\u00fcman indexleme<\/strong> gibi i\u015flemleri ger\u00e7ekle\u015ftiriyor olaca\u011f\u0131z.<\/p>\n<p>Program.cs i\u00e7erisini a\u015fa\u011f\u0131daki gibi kodlayal\u0131m.<\/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 = string.Format(\"{0}_{1}\", ConfigurationManager.AppSettings[\"ElasticSearchIndexName\"],\r\n                                         DateTime.Now.ToString(\"yyyyMMddHHss\"));\r\n            string aliasName = 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, aliasName);\r\n\r\n            Console.ReadKey();\r\n        }\r\n\r\n        private static void CreateIndex(ElasticContext elasticContext, string indexName, string aliasName)\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>\u0130lk olarak &#8220;Main&#8221; method&#8217;u i\u00e7erisine bakt\u0131\u011f\u0131m\u0131zda &#8220;indexName&#8221; ve &#8220;aliasName&#8221; field&#8217;lar\u0131n\u0131 AppSettings \u00fczerinden dolduruyoruz. &#8220;indexName&#8221; olu\u015ftururken dikkat edersek, ilk ba\u015fa index ismi ve alttan \u00e7izgi ile ay\u0131rd\u0131ktan sonra o anki tarih format\u0131n\u0131 saniyesine kadar al\u0131yoruz. Bunu yapmam\u0131zdaki sebep yukar\u0131da <strong>alias<\/strong>&#8216;\u0131n \u00f6neminden bahsederken mevcut index&#8217;i bozmadan farkl\u0131 bir index&#8217;de atabilece\u011fimizden bahsetmi\u015ftik. \u0130\u015fte bu noktada\u00a0en son ne zaman index att\u0131\u011f\u0131m\u0131z\u0131 takip edebiliriz. Daha sonras\u0131nda\u00a0ise ElasticHelper&#8217;\u0131n &#8220;GetConnectionSettings&#8221; method&#8217;unu parametre olarak kullan\u0131p,\u00a0bir ElasticClient yarat\u0131yoruz. Yaratm\u0131\u015f oldu\u011fumuz bu ElasticClient&#8217;\u0131 &#8220;Data&#8221; katman\u0131 i\u00e7erisinde olu\u015fturmu\u015f oldu\u011fumuz ElasticContext&#8217;in constructor&#8217;\u0131na inject ediyoruz. Art\u0131k Context&#8217;imiz haz\u0131r durumda.<\/p>\n<p>Daha fazla kod kalabal\u0131\u011f\u0131 yaratmamak i\u00e7in\u00a0private olarak &#8220;CreateIndex&#8221; isminde bir method yarat\u0131yoruz ve parametre olarak &#8220;ElasticContext, IndexName ve AliasName&#8221;\u00a0objelerini al\u0131yoruz. Daha sonra bu parametreleri kullanarak &#8220;elasticContext&#8221; \u00fczerindeki &#8220;CreateIndex&lt;T&gt;&#8221; method&#8217;unu \u00e7a\u011f\u0131rarak, &#8220;indexName&#8221; ve &#8220;aliasName&#8221; property&#8217;lerini set ediyoruz. Bu i\u015flemlerin sonucunda ise elde edecek oldu\u011fumuz response i\u00e7erisindeki &#8220;StatusMessage&#8221; property&#8217;sini Console yard\u0131m\u0131 ile ekrana yazd\u0131r\u0131yoruz.<\/p>\n<p>Test i\u015flemlerine ba\u015flamadan \u00f6nce ilgili de\u011ferlerimizi\u00a0&#8220;App.config&#8221; i\u00e7erisine ekleyelim.<\/p>\n<pre class=\"lang:c# decode:true\">&lt;?xml version=\"1.0\" encoding=\"utf-8\" ?&gt;\r\n&lt;configuration&gt;\r\n  &lt;startup&gt;\r\n    &lt;supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" \/&gt;\r\n  &lt;\/startup&gt;\r\n      &lt;appSettings&gt;\r\n        &lt;add key=\"ElasticSearchURI\" value=\"http:\/\/localhost:9200\"\/&gt;\r\n        &lt;add key=\"ElasticSearchIndexName\" value=\"product_search\"\/&gt;\r\n      &lt;\/appSettings&gt;\r\n&lt;\/configuration&gt;<\/pre>\n<p>Dilerseniz &#8220;CreateIndex&#8221; method&#8217;u i\u00e7erisindeki &#8220;response&#8221; alan\u0131na bir debug koyal\u0131m ve QuickWatch&#8217;da \u00a0bir bakal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/07\/create-index-elastic.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-689 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/07\/create-index-elastic.jpg\" alt=\"create-index-elastic\" width=\"734\" height=\"402\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/create-index-elastic.jpg 734w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/create-index-elastic-300x164.jpg 300w\" data-sizes=\"(max-width: 734px) 100vw, 734px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 734px; --smush-placeholder-aspect-ratio: 734\/402;\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz\u00a0ilk index&#8217;imiz ba\u015far\u0131l\u0131 bir \u015fekilde olu\u015ftu. \u0130lgili sorgumuz Valid durumda ve &#8220;StatusMessage&#8221; i\u00e7eri\u011fine de bakarsak e\u011fer, &#8220;Valid NEST response built from a successful&#8230;&#8221; \u015feklinde devam ediyor. \u015eimdi do\u011frulamak ad\u0131na Sense plugin&#8217;i \u00fczerinden bir bakal\u0131m.<\/p>\n<p>\u0130lk olarak Sense \u00fczerinden Mapping&#8217;i bir kontrol edelim. Bunun i\u00e7in a\u015fa\u011f\u0131daki sorguyu kullanal\u0131m.<\/p>\n<pre class=\"lang:default decode:true \">GET product_search\/_mapping<\/pre>\n<p>Dikkat edersek GET verb&#8217;\u00fcnden sonra vermi\u015f oldu\u011fumuz aliasName&#8217;i kullan\u0131yoruz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/07\/sense-mapping.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-690 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/07\/sense-mapping.jpg\" alt=\"sense-mapping\" width=\"841\" height=\"568\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/sense-mapping.jpg 841w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/07\/sense-mapping-300x203.jpg 300w\" data-sizes=\"(max-width: 841px) 100vw, 841px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 841px; --smush-placeholder-aspect-ratio: 841\/568;\" \/><\/a><\/p>\n<p>GET sorgusunu execute etti\u011fimizde kar\u015f\u0131m\u0131za ger\u00e7ek index&#8217;imiz &#8220;product_search_201607242334&#8221; ismi ile gelmektedir. \u0130\u00e7erisine bakt\u0131\u011f\u0131m\u0131zda ise &#8220;mappings&#8221; ba\u015fl\u0131\u011f\u0131 alt\u0131nda &#8220;product&#8221; entity&#8217;sinin property&#8217;leri yer almaktad\u0131r ve elastic taraf\u0131ndan otomatik olarak nas\u0131l tutulaca\u011f\u0131n\u0131 yani tiplerini belirlemi\u015ftir.<\/p>\n<p>Bir elastic makalesinin daha sonuna geldik. Bir sonraki makalede ise dok\u00fcman atma gibi i\u015flemlere bir ba\u015flang\u0131\u00e7 yap\u0131yor olaca\u011f\u0131z.<\/p>\n<p>\u015eimdilik sa\u011fl\u0131cakla kal\u0131n.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/07\/ElasticSearch-CreateIndex.rar\">ElasticSearch-CreateIndex<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar. Hat\u0131rlarsak bir \u00f6nceki makalem olan &#8220;ElasticSearch\u2019e Ba\u015flarken (Kurulum, Kibana, Marvel ve Sense)&#8221; ile asl\u0131nda ElasticSearch d\u00fcnyas\u0131na bir ad\u0131m atm\u0131\u015ft\u0131k. Bu makale kapsam\u0131nda ise C# \u00fczerinde ElasticSearch i\u00e7in kullanacak oldu\u011fumuz NEST\u00a0k\u00fct\u00fcphanesini\u00a0tan\u0131yaca\u011f\u0131z ve hemen ard\u0131ndan bir index olu\u015fturaca\u011f\u0131z. Dilerseniz \u00f6ncelikle biraz NEST k\u00fct\u00fcphanesinden\u00a0bahsedelim. NEST: ElasticSearch&#8217;e&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">ElasticSearch Serisi 01 &#8211; C# ile Index Olu\u015fturmak<\/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":[5,193],"tags":[207,210,208,197,205,206,209],"class_list":["post-684","post","type-post","status-publish","format-standard","hentry","category-net","category-search-engine","tag-c-elasticsearch-index","tag-c-elasticsearch-kullanimi","tag-c-elasticsearch-mapping","tag-c-ile-elasticsearch","tag-elasticsearch-create-index","tag-elasticsearch-index-olusturma","tag-elasticsearch-mapping-olusturma","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 01 - C# ile Index Olu\u015fturmak - 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-01-csharp-ile-index-olusturmak\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ElasticSearch Serisi 01 - C# ile Index Olu\u015fturmak - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2016-07-24T20:42:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-07-24T20:49:46+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-01-csharp-ile-index-olusturmak\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"ElasticSearch Serisi 01 &#8211; C# ile Index Olu\u015fturmak\",\"datePublished\":\"2016-07-24T20:42:38+00:00\",\"dateModified\":\"2016-07-24T20:49:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\\\/\"},\"wordCount\":1438,\"commentCount\":8,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"keywords\":[\"C# elasticsearch index\",\"c# elasticsearch kullan\u0131m\u0131\",\"C# elasticsearch mapping\",\"c# ile elasticsearch\",\"ElasticSearch Create Index\",\"ElasticSearch index olu\u015fturma\",\"elasticsearch mapping olu\u015fturma\"],\"articleSection\":[\".NET\",\"Search Engine\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\\\/\",\"name\":\"ElasticSearch Serisi 01 - C# ile Index Olu\u015fturmak - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"datePublished\":\"2016-07-24T20:42:38+00:00\",\"dateModified\":\"2016-07-24T20:49:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ElasticSearch Serisi 01 &#8211; C# ile Index Olu\u015fturmak\"}]},{\"@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 01 - C# ile Index Olu\u015fturmak - 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-01-csharp-ile-index-olusturmak\/","og_locale":"tr_TR","og_type":"article","og_title":"ElasticSearch Serisi 01 - C# ile Index Olu\u015fturmak - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2016-07-24T20:42:38+00:00","article_modified_time":"2016-07-24T20:49:46+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-01-csharp-ile-index-olusturmak\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"ElasticSearch Serisi 01 &#8211; C# ile Index Olu\u015fturmak","datePublished":"2016-07-24T20:42:38+00:00","dateModified":"2016-07-24T20:49:46+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\/"},"wordCount":1438,"commentCount":8,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"keywords":["C# elasticsearch index","c# elasticsearch kullan\u0131m\u0131","C# elasticsearch mapping","c# ile elasticsearch","ElasticSearch Create Index","ElasticSearch index olu\u015fturma","elasticsearch mapping olu\u015fturma"],"articleSection":[".NET","Search Engine"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\/","url":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\/","name":"ElasticSearch Serisi 01 - C# ile Index Olu\u015fturmak - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"datePublished":"2016-07-24T20:42:38+00:00","dateModified":"2016-07-24T20:49:46+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/elasticsearch-serisi-01-csharp-ile-index-olusturmak\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"ElasticSearch Serisi 01 &#8211; C# ile Index Olu\u015fturmak"}]},{"@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\/684","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=684"}],"version-history":[{"count":9,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/684\/revisions"}],"predecessor-version":[{"id":698,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/684\/revisions\/698"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}