ElasticSearch, BigData yani büyük veriler ile çalışan şirketlerin, adından da anlaşılacağı gibi içerik arama, veri analizi, soruglamalar ve öneriler gibi işlemlerde özellikle performans kabiliyetleri, güçlü ve esnek olmasından dolayı tercih ettiği bir search engine’dir. Kimdir bu büyük şirketler LinkedIn, Stack Overflow, Foursquare, GitHub, Amazon gibi. ElasticSearch, java dili ile geliştirilmiş, “Lucene” altyapısı üzerine oturtulmuş open-source bir arama motorudur. Tabi ki boşuna bu dev teknoloji şirketleri tarafından kullanılmamaktadır.
Visual Studio .Net tarafında NEST kütüpahanesi ile bu güçlü arama motoru kolayca implemente edilebilmektedir. Öncelikle nereden indirilir. Benim tercihim : http://ruilopes.com/elasticsearch-setup/ buradan ilgili GitHub reposuna gidip indirebilirsiniz. Bu makalede v5.1.1’i versiyonu kullanılmıştır.
İlgili ElasticSearch setup.exe kurulduktan sonra, windows makinasındaki servisler kısmına “Windows+R” ile run command satırı açılıp, “services.msc” komutu yazılarak erişilir. Buradan aşağıda görülen Elasticsearch Servisi manuel olarak çalıştırılır.
Ben ayrıca gelen json datayı Chrome browser’da düzgün göstermek için “JSON Viewer” extension’ını kullandım. Size de özellikle ElasticSearch ile çalışırken kurmanızı tavsiye ederim. İlgili servis çalıştırıldıktan sonra http://localhost:9200/ adresine gidildiğinde aşağıdaki gibi bir ekran ile karşılaşılır.
Son olarak browser üzerinde post ve get işlemleri yapmak için ben Chrome Extension olarak Postman kurdum. Size de tavsiye ederim.
Ayrıca isterseniz ElasticSearch ile uğraşanların bolca kullandığı Kibana ve monitor tool’u olan Malware’i de buradan kurabilirsiniz. Ben bu makalede bu tooları kullanmayacağım. Tüm işlemleri Postman ve Visual Studio idesi üzerinden yapacağım.
Index: Öncelikle ElasticSearch’de her kayıt bir Json dökümandır. Yani indexler, Json belgeler topluluğudur. Default veya Custom olarak yaratılabilirler. Yeni bir index yaratma sırasında, alias vermek çok sağlıklıdır. Alies verildiği takdirde, indexde olan bir değişiklikten dolayı yeni bir index yaratılıp eskisi kolaylıkla silinebilir. Kısaca her bir index bir çeşit veritabanıdır.
Mapping: Bir veri şablonu ya da data modeli olarak da tarif edebiliriz. Amacı, ilgili dökümanın arama motoruna nasıl aktarılacağının tanımlanmasıdır. Kısaca veritabanında isimlendirdiğimiz bir schema’dır diyebiliriz.
Document: ElasticSearch’deki her bir kayda, yani row’a document denir.
Field: Her bir döküman içindeki alana, field denir. Yani DB’deki bildiğiniz column.
Post.cs: Aşağıda, Mapping’imiz olan bir Post sınıfı tanımlanmıştır. Yani arama işlemi yapılacak data scheması, aşağıdaki gibidir.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ElasticSearch { public class Post { public int UserID { get; set; } public DateTime PostDate { get; set; } public string PostTest { get; set; } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ElasticSearch
{
public class Post
{
public int UserID { get; set; }
public DateTime PostDate { get; set; }
public string PostTest { get; set; }
}
}
Create Index: Aşağıda “NEST” kütüpahanesi kullanılarak, “blog_history” adında bir index yaratılmıştır. Aliases verilmiş ve ilgili index’e ‘bora_blog‘ şeklinde de erişilebilmesi sağlanmıştır. ElasticSearch’e erişilen url :”http://localhost:9200″ “ConnectionSettings” sınıfında tanıtılmıştır. Ve ilgili “ElasticClient” tanımlanan url ile oluşturulup ilgili index “CreateIndex()” methodu ile yaratılmıştır.
public static void CreateNewIndex() { var createIndexDescriptor = new CreateIndexDescriptor("blog_history") .Mappings(ms => ms .Map<Post>(m => m.AutoMap()) ) .Aliases(a => a.Alias("bora_blog")); node = new Uri("http://localhost:9200/"); settings = new ConnectionSettings(node); client = new ElasticClient(settings); var response = client.CreateIndex(createIndexDescriptor); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void CreateNewIndex()
{
var createIndexDescriptor = new CreateIndexDescriptor("blog_history")
.Mappings(ms => ms
.Map<Post>(m => m.AutoMap())
)
.Aliases(a => a.Alias("bora_blog"));
node = new Uri("http://localhost:9200/");
settings = new ConnectionSettings(node);
client = new ElasticClient(settings);
var response = client.CreateIndex(createIndexDescriptor);
}
Bu işlemden sonra “http://localhost:9200/_cat/indices” yazıldığında yaratılan indexlerin tamamı görülebilir.
Yine DefaultIndex, Alies verilmeden “MapDefaultTypeIndices()” methodu ile de aşağıdaki gibi oluşturulabilir.
node = new Uri("http://localhost:9200/"); settings = new ConnectionSettings(node); settings.DefaultIndex("defaultindex") .MapDefaultTypeIndices(m => m.Add(typeof(Post), "my_blog")); client = new ElasticClient(settings);
1
2
3
4
5
6
7
node = new Uri("http://localhost:9200/");
settings = new ConnectionSettings(node);
settings.DefaultIndex("defaultindex")
.MapDefaultTypeIndices(m => m.Add(typeof(Post), "my_blog"));
client = new ElasticClient(settings);
Peki ElasticSearch bu armayı bu kadar hızlı nasıl yapıyor : Bir veri yani document kaydedilirken, veri içerisindeki alanlar yani fieldlar “Apache Lucene” altyapısı kullanılarak indexlenir. Bu şekilde bir kelimenin hangi row’da yani document’da geçtiği indexlenir. Daha sonra ilgili keyword aranırken bu büyük veri kümesi içerisinde değil de, bu oluşturulan index listesi içerisinde arama yapılır. Böylece istenen arama sonucuna, çok büyük bir hızda ulaşılabilir.
Aşağıdaki örnekde: 6 farklı document ve her bir kelimenin geçtiği row sırası ayrı ayrı indexlenerek kaydedilmiştir. Örneğin “night” kelimesi <1>, <4> ve <5> inci rowlarda geçmektedir. Kısaca “night” kelimesini ElasticSearch ile aradığımızda ilgili kümülatif data içerisinde değil de, bu örnekde olduğu gibi önceden tanımlanmış aşağıdaki index listesi içinde aranmakta ve çok daha hızlı bir şekilde bulunabilmektedir.
Peki yüksek trafik durumları için ElasticSearch’de neler yapmalıyız: Burada öncelikle, Nodelar ve Sharding devreye giriyor. Nodelar’ın her birinde 1 tane ElasticSearch çalışır. Her bir node, tüm indexleme ve okuma işlerinde birbirleri ile haberleşir. Tüm Nodelar, “Cluster” dediğimiz sunucu kümeleri içinde bulunur. Shardlar ise, Nodelar içerisinde verilerin indexlenmesini sağlıyan “Apache Lucene” uygulamaının ta kendisidir. Mesela aşağıdaki resimde 2 Node ve 4 Sharding’li bir yapı görülmektedir.
Image Source: https://skelia.com/wp-content/uploads/2014/06/table.png
Peki Makinalardan Biri Çöker İse: (Replica) Tamamen güvenlik amaçlı çalışan, her verinin bir kopyasının bulunduğu başka makinalardır. Böylece bir makina çöktüğünde replica veya replicalarından biri devreye girebilecektir. Örneğin aşağıda 3 Node’lu 3 Shardingli bir yapı söz konusudur. Ve her bir shard’ın 1 yedeği, yani 1 replicası bulunmaktadır. Sonuçta aşağıdaki örnekde 3 Node,3 Shard ve 1 Replica mevcuttur. Toplamda 6 sunucu bulunmaktadır.
NOT: Bir diğer dikkat edilecek konu da, her bir Shard’ın Replicasının başka bir Node’da bulunması gerektiğidir:) Ben Shard’ın ve Replikasının aynı makina konulduğunu, ve daha sonra makina çökünce tüm indexlerin nasıl kaybolduğuna birebir şahit oldum:)
Image Source: https://elastic-stack.readthedocs.io/en/latest/_images/elk_cluster_shard.png
Peki bu Sharding ve Replica sistem tanımı NEST ile .Net tarafında nasıl kodlanır: Aşağıda görüldüğü gibi “IndexSettings()” methodu ile “NumberOfReplicas” ve “NumberOfShards” sayısı belirlenmiş ve yaratılan Index özelliklerine “InitializeUsing()” methodu ile set edilmiştir.
public static void CreateNewIndex() { var indexSettings = new IndexSettings(); indexSettings.NumberOfReplicas = 1; indexSettings.NumberOfShards = 3; var createIndexDescriptor = new CreateIndexDescriptor("blog_history") .Mappings(ms => ms .Map<Post>(m => m.AutoMap()) ) .InitializeUsing(new IndexState() { Settings = indexSettings}) .Aliases(a => a.Alias("bora_blog")); node = new Uri("http://localhost:9200/"); settings = new ConnectionSettings(node); client = new ElasticClient(settings); var response = client.CreateIndex(createIndexDescriptor); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void CreateNewIndex()
{
var indexSettings = new IndexSettings();
indexSettings.NumberOfReplicas = 1;
indexSettings.NumberOfShards = 3;
var createIndexDescriptor = new CreateIndexDescriptor("blog_history")
.Mappings(ms => ms
.Map<Post>(m => m.AutoMap())
)
.InitializeUsing(new IndexState() { Settings = indexSettings})
.Aliases(a => a.Alias("bora_blog"));
node = new Uri("http://localhost:9200/");
settings = new ConnectionSettings(node);
client = new ElasticClient(settings);
var response = client.CreateIndex(createIndexDescriptor);
}
Gelelim yapılan Postların ElastikSearch’de kaydedilmesine: Aşağıda görüldüğü gibi ilgi postlar oluşturulup “my_blog” index’ine post edilmiştir. Daha sonra ilgili row yani documentler “http://localhost:9200/my_blog/post/_search” şeklinde sorgulanarak ekrana basılmıştır.
//Index'in oluşturulması node = new Uri("http://localhost:9200/"); settings = new ConnectionSettings(node); settings.DefaultIndex("defaultindex") .MapDefaultTypeIndices(m => m.Add(typeof(Post), "my_blog")); client = new ElasticClient(settings); //Kaydedilecek Postlar yani Document'ler var post = new Post() { PostDate = DateTime.Now, PostTest = "Begining Angular2", UserID = 1 }; var post2 = new Post() { PostDate = DateTime.Now, PostTest = "What is Elastic Search", UserID = 2 }; //İlgili Documentlerin Indexlenmesi client.Index<Post>(post, idx => idx.Index("my_blog")); client.Index<Post>(post2, idx => idx.Index("my_blog"));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//Index'in oluşturulması
node = new Uri("http://localhost:9200/");
settings = new ConnectionSettings(node);
settings.DefaultIndex("defaultindex")
.MapDefaultTypeIndices(m => m.Add(typeof(Post), "my_blog"));
client = new ElasticClient(settings);
//Kaydedilecek Postlar yani Document'ler
var post = new Post()
{
PostDate = DateTime.Now,
PostTest = "Begining Angular2",
UserID = 1
};
var post2 = new Post()
{
PostDate = DateTime.Now,
PostTest = "What is Elastic Search",
UserID = 2
};
//İlgili Documentlerin Indexlenmesi
client.Index<Post>(post, idx => idx.Index("my_blog"));
client.Index<Post>(post2, idx => idx.Index("my_blog"));
Örnek Ekran Çıktısı:
Peki ElasticSearch’de Query nasıl kullanılır : NEST kütüpahanesi kullanılarak ElastickSearch üzerinde Query işlemleri yapmak aslında biraz detaylı bir konu. Konu hakkında fikir sahibi olunması amacı ile birkaç örnek vermek istiyorum:
Örnek 1: Aşağıdaki örnekde “UserID”‘si 2 olan toplam 10 kayıt çekilmektedir. Burada önemli filter keywordlerinden biri “Term“‘dir.
Termler: Sadece boolen yani “Yes/No” veya string bir kelime ile eşleşebilecek durumlarda kullanılır.
var response = client.Search<Post>(p => p .From(0) .Size(10) .Query(q => q.Term(f => f.UserID, 2) ) );
1
2
3
4
5
6
7
var response = client.Search<Post>(p => p
.From(0)
.Size(10)
.Query(q =>
q.Term(f => f.UserID, 2)
)
);
Sonuç ekranı aşağıdaki gibidir: Indexlenen documentlardan UserID’si 2 olan tek kayıt geri dönülmüştür. İlgili kayda, geri dönen response’daki documentlere bakılarak erişilir. “response.Documents”
Örnek 2: Yukarıdaki örneğe ek olarak “MatchPhrasePrefix()” methodu ile “PostTest” filed’ında “angular” kelimesi geçen kayıtlar(documentlar) da listelenmeye result set’e ulaşılır.
var response = client.Search<Post>(p => p .From(0) .Size(10) .Query(q => q.Term(f => f.UserID, 2) || q.MatchPhrasePrefix(mq => mq.Field(f => f.PostTest).Query("angular")) ) );
1
2
3
4
5
6
7
8
var response = client.Search<Post>(p => p
.From(0)
.Size(10)
.Query(q =>
q.Term(f => f.UserID, 2)
|| q.MatchPhrasePrefix(mq => mq.Field(f => f.PostTest).Query("angular"))
)
);
Aşağıdaki sonuçda da görüldüğü gibi hem UserID‘si 2 olan hem de “PostTest” field’ında “angular” kelimesi geçen rowlar bulunmuştur.
Eğer “MatchPhrasePrefix()” methodu yerine “MatchPhrase()” methodu kullanılsa idi “angular” keyword’ü için bir sonuca ulaşılamaz, yalnızca UserID’si 2 olan result set geri dönülürdü. Nedeni “MatchPhrase()” methodu, içinde geçen kelimeye değil, kelimenin tamamının eşleşmesine bakar. Eğer “angular2” kelimesi aransa idi o zaman ilgili kayda ulaşılabilirdi. Belki bazılarınızın dikkatini çekmiştir. Büyük harflerin örnek “Angular2″‘nin küçük harf şeklinde aranması sonucunda bulunabilmiştir. Bu konuyu ilerde Analyzer kısmında inceleyeceğiz.
Filter: İlgili yazılan Querylerin sonuna filterlar eklenip, arama sonucu daha da daraltılabilir. 2 farklı tipi vardır.
Filtered: Sorgu çalıştırılırken filitreleme işlemi yapılmaktadır. “Prefilter” gibi düşünülebilir.
Filter: Sorgu çalıştırıldıktan sonra dönen sonuç üzerinden, 2. bir işlem olarak gidilmektedir. “Postfilter” gibi düşünülebilir.
Birden fazla filter peş peşe eklenip daha spesifik bir result set’e ulaşılabilir.
Örnek : Aşağıdaki örnekde UserID’si 1 olan ve “PostTest” filed’ında “angular” geçen documentlere ek olarak, “PostFilter()” methodu ile “DateRange” filter eklenmiş ve “PostDate” field’ını “GreaterThanOrEquals()” methodu ile günümüzden 4 gün evelki bir tarihden büyük veya eşit olması koşuluna bakılmıştır.
var response3 = client.Search<Post>(p => p .Query(q =>q.Term(t => t.UserID,1)) .Query(q => q.MatchPhrasePrefix(mq => mq.Field(f => f.PostTest).Query("angular"))) .PostFilter(f => f.DateRange(r => r.Field(f2 => f2.PostDate).GreaterThanOrEquals(DateTime.Now.AddDays(-4))))
1
2
3
4
var response3 = client.Search<Post>(p => p
.Query(q =>q.Term(t => t.UserID,1))
.Query(q => q.MatchPhrasePrefix(mq => mq.Field(f => f.PostTest).Query("angular")))
.PostFilter(f => f.DateRange(r => r.Field(f2 => f2.PostDate).GreaterThanOrEquals(DateTime.Now.AddDays(-4))))
Aramalarda Vurgu Yapmak Highlight :
ElasticSearch’de arama yapıldığı zaman, bulunan sonuçların ilgili Query text’in nerelerinde eşlediğinin gösterildiği güzel bir yapıdır.
Örnek Highlight: Aşağıda görüldüğü gibi önce “Query” sonra “Filter” ve daha sonra “Highlight” tanımlanmıştır.
“PreTags”: İlgili filiterlardan sonra bulunan result’ın başına konacak karkter belirlenir.
“PostTags”: İlgili filiterlardan sonra bulunan result’ın sonuna konacak karkter belirlenir.
“Fields”: Highlight amaçlı bakılacak kolon belirlenir.
İlgili çıktıların alınması için dönüş yani response’un HITS‘lerine bakılır.
HITS Propert’sinden dönen fieldlar:
HITS : Toplam geri dönüş adedine, toplam score’u gibi bilgileri veren, her bir dönen row’un “_id”‘sini, “_Score”‘unu, “Highlights”‘ını ve bunun gibi birçok kritik veriyi dönen çok önemli bir propertydir.
var response3 = client.Search<Post>(p => p .Query(q => q.MatchPhrasePrefix(mq => mq.Field(f => f.PostTest).Query("angular"))) .PostFilter(f => f.DateRange(r => r.Field(f2 => f2.PostDate).GreaterThanOrEquals(DateTime.Now.AddDays(-3)))) .Highlight(h => h .PreTags("<font color='red'><b>") .PostTags("</b></font>") .Fields( fs => fs .Field(n => n.PostTest) .Type("plain") .ForceSource() ) ) foreach (var highlightsInEachHit in response3.Hits.Select(d => d.Highlights)) { foreach (var highlightField in highlightsInEachHit) { Console.WriteLine(highlightField.Value.Highlights.First()); } } Console.ReadLine();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var response3 = client.Search<Post>(p => p
.Query(q => q.MatchPhrasePrefix(mq => mq.Field(f => f.PostTest).Query("angular")))
.PostFilter(f => f.DateRange(r => r.Field(f2 => f2.PostDate).GreaterThanOrEquals(DateTime.Now.AddDays(-3))))
.Highlight(h => h
.PreTags("<font color='red'><b>")
.PostTags("</b></font>")
.Fields(
fs => fs
.Field(n => n.PostTest)
.Type("plain")
.ForceSource()
)
)
foreach (var highlightsInEachHit in response3.Hits.Select(d => d.Highlights))
{
foreach (var highlightField in highlightsInEachHit)
{
Console.WriteLine(highlightField.Value.Highlights.First());
}
}
Console.ReadLine();
Ekran Çıktısı: Yukarıda görüldüğü gibi dönen result değeri içindeki HITS’ler gezilerek, ilgili Highlights değerleri ekrana bastırılmıştır. Aşağıdaki ekran çıktısında da görüldüğü gibi, aranan “angular” keyword’ü bulunduğu text içerisinde başına ve sonuna belirlenen “<font color=’red’><b> </b></font>” html tagları ile çevrelenmiştir.
Bu makale ile ElasticSearch’e sıkı bir giriş yaptığımız kanısındayım. Aslında ElasticSearch leb i derya bir deniz. İlerleyen zamanlarda bu konu üzerinde yazmaya devam edeceğim. Daha Analyzer, Synonym, Aggregation, Suggesters gibi bahsedilmeyen birçok konu mevcut. Diyip içinize düşürdüğüm bu kurt ile merakınızı ve algınızı maximuma çıkardığımı düşünüyorum :)
Geldik bir makalenin daha sonuna :)
Yeni bir makalede görüşmek üzere hoşçakalın.
Source:
https://www.elastic.co/guide/en/elasticsearch/client/net-api/2.x/auto-map.html
https://stackoverflow.com/questions/46182568/how-to-create-index-using-createmappingdescriptor-for-elastic-search-using-nest
Herkes Görsün:
Twitter0
Facebook0
LinkedIn0
Etiketler: DocumentElasticSearchfilterHighlightHitsIndexMappingNESTNodequeryReplicaShardingTerm
Bunlar da hoşunuza gidebilir...
13
Bir İş Görüşmesinde Detaylı İstenen Proje Bölüm1
11 Aralık 2015
4
Login Olunmayan Mobile Bir Projede, Token İle Güvenlik
29 Mart 2020
7
Mvc’de Çoklu Resim Yükleme ve DropBox’a Yedekleme
18 Eylül 2015
36 Cevaplar
Yorumlar36
Referans Bildirimi0
mehmet dedi ki:	
22 Aralık 2016, 12:11	
merhabalar guzel bir makale
konu degil ama bana ucretsiz document veya relation db lazim. 5gb lik . Bilgisi olan arkadaslardan destek bekliyorum
Cevapla
Sinan Bozkuş dedi ki:	
22 Aralık 2016, 19:42	
Kaliteli bir makale olmuş, elinize sağlık.
Cevapla
borsoft dedi ki:	
22 Aralık 2016, 23:49	
Teşekkürler Sinan..
Cevapla
Selcan dedi ki:	
27 Aralık 2016, 11:51	
Yazdığınız tüm makaleler başarılı. Emeğinize sağlık.
Cevapla
borsoft dedi ki:	
27 Aralık 2016, 12:06	
Çok teşekkürler Selcan :)
Cevapla
süleyman yalçın dedi ki:	
31 Aralık 2016, 23:45	
Elinize sağlık Bora bey.
Sizce bir projede Cache yapısı(enterprise,memorycache vs..) yerine ElasticSearch kullanılsa mantıklı olurmu?
Sonucta ElasticSearch da kendi üzerinde cache yapıyor ve anladığım kadarıyla sql sorgularından daha hızlı. Ozaman veri okuma işlemlerimizi direk ElasticSearch üzerinde yapsak ve create,delete,update işlemleri için sadece sql kullansak mantıklı olurmu?
Cevapla
borsoft dedi ki:	
1 Ocak 2017, 02:50	
Selamlar Süleyman Bey,
Bu şekilde kullananlar da var. Ama ben kesinlikle onaylamıyorum. Tabiki data çekmek için herzaman Sql’e gitmemelisiniz. Bence Radis gibi bir harici memcache kullanmanız daha performanslı olucaktır. Gerçekten Search işlemi yapacak iseniz o zaman Elastic kullanınız. Analizinize yazık :)
İyi yıllar iyi çalışmalar.
Cevapla
Burak Kaşıkcı dedi ki:	
6 Mart 2017, 13:18	
Güzel bir makale olmuş, emeğinize sağlık.
Cevapla
borsoft dedi ki:	
6 Mart 2017, 13:33	
Teşekkürler Burak. Bu aralar farklı konular ile ilgileniyorum. Ama devamıda gelicek.
Cevapla
Tayfun dedi ki:	
21 Nisan 2017, 03:19	
Devamını bekliyoruz hocam. Projelere eklemek için sabırsızlanıyorum :)
Cevapla
borsoft dedi ki:	
23 Nisan 2017, 20:24	
Elimden geleni yapacağım..
Kolay gelsin..
Cevapla
Metin dedi ki:	
30 Temmuz 2017, 18:50	
Çok güzel ve bilgilendirici bir makaleydi. Teşekkürler.
Cevapla
borsoft dedi ki:	
1 Ağustos 2017, 00:05	
Ben teşekkür ederim Metin :)
Cevapla
selcuk dedi ki:	
20 Ocak 2018, 14:51	
Çok yararlı bir döküman olmuş
Cevapla
borsoft dedi ki:	
21 Ocak 2018, 18:20	
Teşekkürler Selcuk..
Cevapla
Cihan dedi ki:	
30 Ocak 2018, 01:03	
Bora hocam, ellerinize sağlık çok güzel bir makele olmuş.
Devamını bekleriz :)
Cevapla
borsoft dedi ki:	
4 Şubat 2018, 23:29	
Teşekkürler Cihan.
Cevapla
Barış dedi ki:	
19 Mart 2018, 11:05	
Merhaba, Big data örneği üzerinde ElasticSearch Apache Spark (SparkSQL) farkı nedir acaba? Performans olarak hangisini önerirsiniz.
Cevapla
Ibrahim dedi ki:	
3 Nisan 2018, 09:46	
Merhabalar,
Elinize sağlık,çok güzel bir paylaşım olmuş.
Cevapla
borsoft dedi ki:	
7 Nisan 2018, 03:26	
Ben teşekkür ederim.
Cevapla
Mustafa dedi ki:	
6 Temmuz 2018, 08:46	
Makaleniz için teşekkürler.
Şöyle bir sorum olacak;
Index dosyalarımızı oluşturduğumuzda
dosya boyutuna göre mi ölçekleniyor.
Eğer bu şekilde değilse node sayısını neye göre belirleyebiliriz?
Teşekkürler.
Cevapla
Ahmet dedi ki:	
26 Temmuz 2018, 10:56	
Elinize, emeğinize sağlık Bora hocam. Çok faydalı oldu. Ufak bir sorum olacaktı. Örnekte yukarıdan aşağı giderken
var createIndexDescriptor = new CreateIndexDescriptor(“blog_history”)
.Mappings(ms => ms
.Map(m => m.AutoMap())
)
.Aliases(a => a.Alias(“bora_blog”));
şeklinde bir index tanımlaması mevcut. Sonrasında ise default index ile devam etmişsiniz.
settings.DefaultIndex(“defaultindex”).MapDefaultTypeIndices(m => m.Add(typeof(Post), “my_blog”));
Burada default ile devam etmeden index oluşturmak için createIndexDescriptor’u nasıl kullanabiliriz?
Teşekkürler;
Cevapla
borsoft dedi ki:	
26 Temmuz 2018, 20:23	
Selam Ahmet,
Öncelikle teşekkürler :) .Aliases(a => a.Alias(“bora_blog”)) ile bir index tanımlaması yapılmıyor. Var olan index’e eşlenik isim veriliyor. Böylece ilgili index üzerinde bir işlem yapıldığında alies verilen kolaylıkla silinip yenisi yaratılabiliyor Bir elastic search üzerinde 2 index aşağıdaki gibi yaratılabilir. Tek tek yaratılabilir. Ama çoklu Alias’da yaratabilirsin. O da işini görür :)
client.CreateIndex(c => c
.Index(“myindexname”)
.InitializeUsing(settings)
);
Ayrıca tüm indexler ==> GET /_cat/indices?v ya da “localhost:9200/_cat/indices?v”
Tüm aliesler ==> “http://localhost:9200/_aliases” şeklinde listelenebilir.
İyi çalışmalar.
Hoşçakal..
Cevapla
veysel sebu dedi ki:	
10 Nisan 2019, 15:35	
elinize sağlık çok güzel ..
Cevapla
borsoft dedi ki:	
15 Nisan 2019, 02:22	
Teşekkürler Veysel :)
Cevapla
Dr. Hayati TAŞTAN dedi ki:	
8 Mayıs 2019, 10:04	
Teşekkürler, yararlı bir paylaşım.
Cevapla
borsoft dedi ki:	
8 Mayıs 2019, 22:33	
Asıl ben teşekkür ederim.
Cevapla
Savaş HASÇELİK dedi ki:	
7 Haziran 2019, 03:15	
Abi eyvallah be çok teşekkür ederim. Bilgi borçlandım, sana ödeyemem belki ama söz senin adına bir başkasına aktarıcam. Çok teşekkür ederim tekrardan .
Cevapla
borsoft dedi ki:	
8 Haziran 2019, 15:09	
Ben teşekkür edrim.
Başkasına aktar daha başka ne isterim:)
Cevapla
Mersan reklam dedi ki:	
6 Ağustos 2019, 20:43	
Hocam senin bütün makalelerin çok güzel eline sağlık saygılarımla
Cevapla
borsoft dedi ki:	
7 Ağustos 2019, 00:53	
Eyvallah,
İsteyerek yapılan hersey güzeldir :)
Cevapla
Orkun dedi ki:	
14 Kasım 2019, 09:09	
Hocam ufak bir sorum olacaktı;
public static void CreateNewIndex()
{
var createIndexDescriptor = new CreateIndexDescriptor(“blog_history”)
.Mappings(ms => ms
.Map(m => m.AutoMap())
)
.Aliases(a => a.Alias(“bora_blog”));
node = new Uri(“http://localhost:9200/”);
settings = new ConnectionSettings(node);
client = new ElasticClient(settings);
var response = client.CreateIndex(createIndexDescriptor);
}
Bunu hangi dosya içinde yapıyorsunuz acaba?
Cevapla
Rıdvan Tayfur dedi ki:	
26 Aralık 2019, 09:48	
@borsoft selamlar makale çok başarılı eline sağlık benim sormak istediğim şey şu bu elasticsearch uygulamasının backubını alabileceğim uygulama var mı (veeam, netbackup , avamar v.s?) nod mantığıyla v.s
Cevapla
Ali Taş dedi ki:	
21 Temmuz 2020, 09:31	
Şimdiye kadar okuduğum en faydalı makale oldu teşekkürler
Cevapla
borsoft dedi ki:	
28 Temmuz 2020, 10:30	
Çok teşekkürler.
Cevapla
Samet dedi ki:	
17 Kasım 2021, 22:17	
Hocam makaleniz çok güzel ve faydalı olmuş teşekkürler.
Bir sorum olacaktı udemy veya youtube de ELK yi anlatan bir eğitim serisi hazırlayabilir misiniz?
bu konuda fazla Türkçe kaynak yok öğrenmek isteyenler için çok iyi olur.
Cevapla
süleyman yalçın için bir cevap yazın Cevabı iptal et
E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir
Yorum
İsim *
E-posta *
İnternet sitesi
Δ
Takip Et:
Sonraki yazı FSM Vakıf Üniversitesi 2016 Aralık Semineri
Önceki yazı İstanbul Üniversitesi Bilfest’17 Semineri
About
Hakkımda
Arama:
Son Yazılar
Yazılımcı Topluluğu Tarafından Çok İstenen .Net 6.0 Apileri 28 Kasım 2021
C# 10 Record Struct 12 Kasım 2021
Derinlemesine Recordlar 15 Ekim 2021
Kategoriler
Kategoriler Kategori seçin .NET 5.0 .Net 6.0 Angular Angular 7 Angular 8 Angular 9 Angular4 Angular6 Angular7 AngularJs AngularJS2 Azure Code First Cross Platform Asp.Net Core Visual Studio Code Visual Studio For Mac Design Pattern EF Core ElasticSearch Genel Go Kinect Mobile Android IOS MongoDB NodeJs RabbitMQ Redis signalR SocketIO SQL Web Asp.Net Web Forms CSS3 Games HTML5 Javascript Jquery Knockout MVC SignalR TypeScript Web API Windows Console Application Windows Forms Windows Service WPF Xamarin
Son Yorumlar
SignalR’ı Derinlemesine İnceleme için Ali
C# 7’de Gelmesi Muhtemel Yeni TUPLES Özellikleri için batu
.Net 6.0 İle Gelen Yenilikler için Mert Metin
ElasticSearch Nedir? için Samet
C# 10 Record Struct için samet
Arşivler
Arşivler Ay seçin Kasım 2021 Ekim 2021 Eylül 2021 Ağustos 2021 Haziran 2021 Mayıs 2021 Nisan 2021 Mart 2021 Şubat 2021 Ocak 2021 Aralık 2020 Kasım 2020 Ekim 2020 Eylül 2020 Haziran 2020 Nisan 2020 Mart 2020 Şubat 2020 Ocak 2020 Aralık 2019 Kasım 2019 Ekim 2019 Eylül 2019 Ağustos 2019 Temmuz 2019 Haziran 2019 Mayıs 2019 Nisan 2019 Mart 2019 Şubat 2019 Ocak 2019 Aralık 2018 Kasım 2018 Ekim 2018 Eylül 2018 Ağustos 2018 Temmuz 2018 Haziran 2018 Mayıs 2018 Nisan 2018 Mart 2018 Ocak 2018 Aralık 2017 Kasım 2017 Ekim 2017 Eylül 2017 Temmuz 2017 Haziran 2017 Mayıs 2017 Nisan 2017 Mart 2017 Şubat 2017 Ocak 2017 Aralık 2016 Kasım 2016 Ekim 2016 Eylül 2016 Ağustos 2016 Temmuz 2016 Haziran 2016 Mayıs 2016 Nisan 2016 Mart 2016 Şubat 2016 Ocak 2016 Aralık 2015 Kasım 2015 Ekim 2015 Eylül 2015 Ağustos 2015 Temmuz 2015 Haziran 2015 Mayıs 2015 Nisan 2015 Mart 2015 Şubat 2015 Ocak 2015 Aralık 2014 Kasım 2014 Ekim 2014 Eylül 2014 Ağustos 2014 Temmuz 2014