ElasticsearchExample · Elasticsearch ile Ürün İndeksleme ve Arama API Örneği
NEST üzerinden indeks oluşturma, belge CRUD ve wildcard QueryString aramasını seçenek modeli ve ayrı servis katmanıyla sunan Elasticsearch API örneği.
Bir ürünün kimliğini biliyorsak onu doğrudan açabiliriz. Katalogda yalnızca adın bir bölümünü hatırlıyorsak bir arama sorgusuna ihtiyaç duyarız. ElasticsearchExample, bu iki yolu aynı ürün API’sinde gösteren bir ASP.NET Core 8 projesi. Ürünler ad, kategori, fiyat ve metin biçiminde bir kimlikle temsil ediliyor. API bu nesneleri products-index adlı Elasticsearch indeksine belge olarak yazıyor ve belgeleri hem kimlik üzerinden hem de arama metniyle okuyabiliyor.
İndeks hazırlığından belge oluşturmaya
POST /api/Products/create-index çağrısı, indeksin varlığını sorgular ve mevcut olmadığında bir oluşturma isteği gönderir. Ürün eklemek için kullanılan POST /api/Products ise CreateProductDto içindeki ad, kategori ve fiyatı alır. Denetleyici bir Guid üretip metne dönüştürür, Product nesnesini kurar ve servise indekslemesi için iletir. Kimliğin sunucuda üretildiği bu akışta, istemci ekleme isteğine bir kimlik vermeden yeni belge gönderebilir.
GET /api/Products/{id} çağrısı arama sorgusu çalıştırmak yerine belgeyi doğrudan kimliğiyle ister. Servis, Elasticsearch yanıtındaki Source nesnesini verir. Bu nesne boşsa denetleyici 404 Not Found döndürür. Aynı kimlik, PUT ile güncellemede ve DELETE ile silmede kullanılır. Oluşturma ve güncelleme isteklerinde ayrı DTO sınıfları yer alır. Her iki sınıf da ad, kategori ve fiyatı taşırken güncellenecek belgenin kimliği URL’den gelir.
Katalogda `klav` aramak
Bir ziyaretçinin klavye ararken yalnızca klav yazdığını düşünelim. GET /api/Products/search/klav çağrısında servis, bu metni *klav* biçimine getirip NEST üzerinden Elasticsearch’ün query_string sorgusuna verir. Sonuçta Elasticsearch’ün döndürdüğü belge listesi API yanıtına aktarılır. Kod aramayı belirli bir ürün alanına açıkça bağlamaz. Bu yüzden hangi değerlerin eşleşeceği indeks alanlarına ve Elasticsearch’ün sorguyu nasıl yorumladığına bağlıdır.
Yıldızlı ifade, terimlerin bir bölümünü yazınca arama yapmayı denemek için anlaşılır bir başlangıç sunar. Aynı zamanda arama metni doğrudan sorgu sözdizimine girdiği için özel karakterler de yorumlanabilir. Başında yıldız olan sorgular geniş terim kümelerini tarayabildiğinden bu yaklaşımın maliyeti katalog büyüdükçe değişir. Örnekte amaç, kimlikle belge istemekle bir metin sorgusu çalıştırmanın iki ayrı işlem olduğunu küçük bir ürün kümesinde göstermek.
Yeni eklenen bir belgeyi denemede kimlikle okuma ve metin araması farklı zamanlarda sonuç verebilir. Elasticsearch, indeksin aramada görünen hâlini yenileme döngüsünde günceller. Servis indeksleme çağrısında özel bir yenileme seçeneği belirtmediğinden, arama sonucuna bakarken bu gecikmeyi hesaba katmak gerekir.
Web API ile Elasticsearch istemcisi arasındaki sınır
ProductsController istekleri karşılar, ürün modelini kurar ve indeks adını seçer. IElasticsearchService arkasındaki sınıf, indeksleme, okuma, güncelleme, silme ve arama çağrılarını NEST ile yürütür. Bağlantı adresi ve varsayılan indeks ElasticsearchOptions üzerinden okunur. Depodaki Docker Compose dosyası Elasticsearch ve Kibana için yerel bir kurulum tanımlar. Geliştirme ortamındaki Swagger arayüzünde bir ürün ekleyip önce kimliğiyle açmak, sonra adının bir bölümünü aramak bu iki okuma yolunu yan yana görmeyi sağlar.