Merhabalar;
Bu yazımda .Net’de ElasticSearch nasıl kullanılır buna bakacağız.
ElasticSearch Lucene library’si üzerine inşaa edilmiş çok yetenekli açık kaynak bir metin arama motorudur.
ElasticSearch, verileri JSON biçiminde saklayan bir Veritabanıdır. Verileri yapılandırılmamış biçimde saklar. Elasticsearch, indeksleme, otomatik tahmin vb. işlemler için Lucene StandardAnalyzer kullanıyor. Elasticsearch’ün bütün özellikleri bir REST API olarak bulunmaktadır. API’nin yardımıyla, Arama, Verileri Alma, Gönderme, Silme işlemlerini yapabiliyoruz.
ElasticSearch Java ile geliştirilmiştir, öncelikle kurulum ve yapılandırması için JRE’yi kurmalıyız.
JRE yüklendikten sonra aşağıdaki bağlantıdan ElasticSearch indirerek kurmamız gerekmektedir;
https://www.elastic.co/downloads/elasticsearch
Elasticsearch yüklendikten sonra, herhangi bir browser yardımıyla aşağıdaki linke girerek ElasticSearch çalışıyormu kontrol ediyoruz.
http://localhost:9200
Bir sorun yoksa Web veya WebApi projesi oluşturarak devam edebilirsiniz.
Biz ElasticSearch işlemleri için NEST nuget paketini kullanacağız, bu paketi Nuget yöneticisi ile projemize kuruyoruz.;
Paketi yükledikten sonra projemizde kullanmak için
using Nest;
eklemeyi unutmuyoruz.
Şimdi kodlamamıza geçebiliriz; Bağlanmak, dize oluşturmak, veri yazmak ve eklemek için bir API oluşturuyoruz;
[System.Web.Http.Route("ConnectAndInsertData")]
[System.Web.Http.HttpPost]
public HttpResponseMessage ConnectAndInsertData(RawData model)
{
HttpResponseMessage response = new HttpResponseMessage();
var jsonResult = "";
try
{
if (model != null)
{
Uri EsInstance = new Uri("http://localhost:9200");
ConnectionSettings EsConfiguration = new ConnectionSettings(EsInstance );
ElasticClient EsClient = new ElasticClient(EsConfiguration);
var settings = new IndexSettings { NumberOfReplicas = 1, NumberOfShards = 2 };
var indexConfig = new IndexState
{
Settings = settings
};
if (!EsClient.IndexExists("sample").Exists) // I am creating database named "sample". check if exist before creating the new
{
EsClient.CreateIndex("sample", c => c
.InitializeUsing(indexConfig)
.Mappings(m => m.Map<RawData>(mp => mp.AutoMap())));
}
var getTableData = EsClient.Count<RawData>(s => s.Index("sample").Type("rawdata"));
if (EsClient.IndexExists("sample").Exists)
{
var result = EsClient.Index(model, i => i
.Index("sample")
.Type("rawdata")
.Id(getTableData.Count + 1)
.Refresh(Elasticsearch.Net.Refresh.True)
);
if (Convert.ToString(result.Result) == "Created")
{
jsonResult = JsonConvert.SerializeObject("{\"result\":true\"}");
response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonResult, Encoding.UTF8, "application/json");
}
}
}
}
catch (Exception ex)
{
jsonResult = JsonConvert.SerializeObject("{\"result\":false\"}");
response = Request.CreateResponse(HttpStatusCode.InternalServerError);
response.Content = new StringContent(jsonResult, Encoding.UTF8, "application/json");
}
if (string.IsNullOrEmpty(jsonResult))
{
jsonResult = JsonConvert.SerializeObject("{\"result\":false\"}");
response = Request.CreateResponse(HttpStatusCode.ExpectationFailed);
response.Content = new StringContent(jsonResult, Encoding.UTF8, "application/json");
}
return response;
}
Şimdi verilerin çekilip çekilmediğini kontrol etmeliyiz, bunun için tablodan verileri alabilmek adına bir API daha oluşturuyoruz;
[System.Web.Http.Route("GetData")]
[System.Web.Http.HttpGet]
public HttpResponseMessage GetData()
{
HttpResponseMessage response;
Uri EsInstance = new Uri("http://localhost:9200");
ConnectionSettings EsConfiguration = new ConnectionSettings(EsInstance );
ElasticClient EsClient = new ElasticClient(EsConfiguration);
var getTableData = EsClient.Search<RawData>(s => s.Index("sample").Type("rawdata").Size(300000).Take(10000)); // you can get maximum 10000 records at a time
var jsonResult = JsonConvert.SerializeObject("{\"result\":true\"}");
List<RawData> lstData = new List<RawData>();
foreach (var hit in getTableData.Hits)
{
lstData.Add(hit.Source);
}
if (lstData != null)
{
jsonResult = JsonConvert.SerializeObject(getTableData);
}
response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonResult, Encoding.UTF8, "application/json");
return response;
}
Böylece, .NET ile ElasticSearch’e veri ekleme ve verilerde arama yapmış olduk. Diğer makalelerimde silme, tam arama yapma gibi konulara değineceğim.