PHP ve GO ile Elasticsearch kullanımı
Bir önceki yazımızda Elasticsearch hakkında temel kavramları öğrenerek Docker üzerinde örnekler yapmıştık. Bu yazımızda ise PHP ve GO ile index oluşturma, veri ekleme ve arama konularına değinecegiz.
-> Elasticsearch Nasıl Çalışır?
-> Elasticsearch’ü Docker üzerinde çalıştırma
-> Elasticsearch ile Index Oluşturma ve Arama
PHP ile Elasticsearch kullanımı
Elasticsearch birçok dil için bir sdk yayınlamıştır.
ilk olarak Elasticsearch-PHP kütüphanesini projemize dahil ediyoruz.
composer require elasticsearch/elasticsearch
Index oluşturmak için aşağıdaki kod örnegini inceleyebiliriz.
<?php
require 'vendor/autoload.php'; // Elasticsearch-PHP kütüphanesini yüklüyoruz
use Elasticsearch\ClientBuilder;
// Elasticsearch sunucusuna bağlanmak için gerekli bilgiler
$hosts = [
'localhost:9200' // Elasticsearch sunucunuzun adresi ve portu
];
// Elasticsearch istemcisini oluşturuyoruz
$client = ClientBuilder::create()
->setHosts($hosts)
->setBasicAuthentication(config('elastic.username'), config('elastic.password'))
->build();
// Yeni bir index oluşturma isteği
$params = [
'index' => 'my-index', // Oluşturulacak index adı
'body' => [
'settings' => [
'number_of_shards' => 1,
'number_of_replicas' => 1
],
'mappings' => [
'properties' => [
'title' => [
'type' => 'text'
],
'content' => [
'type' => 'text'
],
'date' => [
'type' => 'date'
],
'views' => [
'type' => 'integer'
]
]
]
]
];
// Index oluşturma isteğini Elasticsearch'e gönderiyoruz
$response = $client->indices()->create($params);
// Elasticsearch'ten gelen yanıtı işliyoruz
echo 'Index oluşturma sonucu: ' . json_encode($response);
Şimdi veri setimizi indexletelim.
<?php
require 'vendor/autoload.php'; // Elasticsearch-PHP kütüphanesini yüklüyoruz
use Elasticsearch\ClientBuilder;
// Elasticsearch sunucusuna bağlanmak için gerekli bilgiler
$hosts = [
'localhost:9200' // Elasticsearch sunucunuzun adresi ve portu
];
// Elasticsearch istemcisini oluşturuyoruz
$client = ClientBuilder::create()
->setHosts($hosts)
->setBasicAuthentication(config('elastic.username'), config('elastic.password'))
->build();
// Veri seti
$data = [
[
'title' => 'Elasticsearch Başlangıç Rehberi',
'content' => 'Elasticsearch hakkında detaylı bir başlangıç rehberi.',
'date' => '2023-05-15',
'views' => 100
],
[
'title' => 'Elasticsearch İleri Seviye Kılavuzu',
'content' => 'Elasticsearch kullanımında ileri seviye ipuçları ve teknik detaylar.',
'date' => '2023-06-20',
'views' => 150
],
[
'title' => 'Elasticsearch ile Veri Analizi',
'content' => 'Elasticsearch kullanarak veri analizi yöntemleri ve teknikleri.',
'date' => '2023-07-10',
'views' => 120
]
];
// Her belgeyi Elasticsearch'e ekliyoruz
foreach ($data as $item) {
$params = [
'index' => 'my-index',
'body' => $item
];
$response = $client->index($params);
echo 'Belge ekleme sonucu: ' . json_encode($response) . '<br>';
}
Daha sonra aşağıdaki kod örnegi ile en son yaptıgımız arama sorgusunu gerçekleştirebiliriz.
<?php
require 'vendor/autoload.php'; // Elasticsearch-PHP kütüphanesini yüklüyoruz
use Elasticsearch\ClientBuilder;
// Elasticsearch sunucusuna bağlanmak için gerekli bilgiler
$hosts = [
'localhost:9200' // Elasticsearch sunucunuzun adresi ve portu
];
// Elasticsearch istemcisini oluşturuyoruz
$client = ClientBuilder::create()
->setHosts($hosts)
->setBasicAuthentication(config('elastic.username'), config('elastic.password'))
->build();
// Elasticsearch'e gönderilecek sorgu
$params = [
'index' => 'my-index',
'body' => [
'query' => [
'match' => [
'content' => 'Elasticsearch'
]
],
'sort' => [
'date' => ['order' => 'desc']
]
]
];
// Elasticsearch'e sorguyu gönderiyoruz
$response = $client->search($params);
// Elasticsearch'ten gelen yanıtı işliyoruz
$results = $response['hits']['hits'];
foreach ($results as $result) {
$source = $result['_source'];
echo 'Title: ' . $source['title'] . '<br>';
echo 'Content: ' . $source['content'] . '<br>';
echo 'Date: ' . $source['date'] . '<br>';
echo 'Views: ' . $source['views'] . '<br><br>';
}
GO ile Elasticsearch Kullanımı
Go için de bir SDK bulunmakta. Projemize dahil ederek create index örnegi oluşturalım.
package main
import (
"context"
"encoding/json"
"log"
"github.com/elastic/go-elasticsearch/esapi"
"github.com/elastic/go-elasticsearch/v8"
)
func main() {
// Elasticsearch istemcisini oluştur
cfg := elasticsearch.Config{
Addresses: []string{
"http://localhost:9200",
},
}
esClient, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("Error creating Elasticsearch client: %s", err)
}
// Index ayarları ve mapping
settings := map[string]interface{}{
"settings": map[string]interface{}{
"number_of_shards": 1,
"number_of_replicas": 1,
},
"mappings": map[string]interface{}{
"properties": map[string]interface{}{
"title": map[string]interface{}{
"type": "text",
},
"content": map[string]interface{}{
"type": "text",
},
"date": map[string]interface{}{
"type": "date",
},
"views": map[string]interface{}{
"type": "integer",
},
},
},
}
// Index oluşturma isteği
req := esapi.IndicesCreateRequest{
Index: "my-index", // Oluşturulacak index adı
Body: esClient.Indices.BuildCreateIndexBody("my-index", esClient.Indices.CreateIndex.WithBody(strings.NewReader(jsonToString(settings)))),
}
// Index oluşturma isteğini gönder
res, err := req.Do(context.Background(), esClient)
if err != nil {
log.Fatalf("Error creating index: %s", err)
}
defer res.Body.Close()
// Yanıtı kontrol et
if res.IsError() {
log.Fatalf("Error response: %s", res.String())
} else {
log.Println("Index created successfully")
}
}
// JSON verisini string'e dönüştürme
func jsonToString(data map[string]interface{}) string {
jsonData, err := json.Marshal(data)
if err != nil {
log.Printf("Error converting JSON to string: %s", err)
return ""
}
return string(jsonData)
}
Şimdide veri setimizi indexliyoruz
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"github.com/elastic/go-elasticsearch/esapi"
"github.com/elastic/go-elasticsearch/v8"
)
func main() {
// Elasticsearch istemcisini oluştur
cfg := elasticsearch.Config{
Addresses: []string{
"http://localhost:9200",
},
}
esClient, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("Error creating Elasticsearch client: %s", err)
}
// Belge verileri
documents := []map[string]interface{}{
{
"title": "Elasticsearch Başlangıç Rehberi",
"content": "Elasticsearch hakkında detaylı bir başlangıç rehberi.",
"date": "2023-05-15",
"views": 100,
},
{
"title": "Elasticsearch İleri Seviye Kılavuzu",
"content": "Elasticsearch kullanımında ileri seviye ipuçları ve teknik detaylar.",
"date": "2023-06-20",
"views": 150,
},
{
"title": "Elasticsearch ile Veri Analizi",
"content": "Elasticsearch kullanarak veri analizi yöntemleri ve teknikleri.",
"date": "2023-07-10",
"views": 120,
},
}
// Her bir belgeyi Elasticsearch'e ekleyin
for _, doc := range documents {
// Belge verisini JSON formatına dönüştürün
docBytes, err := json.Marshal(doc)
if err != nil {
log.Printf("Error marshalling document: %s", err)
continue
}
// Indexleme isteği oluşturun
req := esapi.IndexRequest{
Index: "my-index",
Body: json.NewDecoder(bytes.NewReader(docBytes)),
DocumentID: "", // Elasticsearch otomatik olarak ID atar
Refresh: "true",
}
// Indexleme isteğini gönderin
res, err := req.Do(context.Background(), esClient)
if err != nil {
log.Printf("Error indexing document: %s", err)
continue
}
defer res.Body.Close()
// Yanıtı okuyun ve işleyin
var resMap map[string]interface{}
if err := json.NewDecoder(res.Body).Decode(&resMap); err != nil {
log.Printf("Error decoding response: %s", err)
continue
}
fmt.Println("Belge ekleme sonucu:", resMap)
}
}
Son olarak PHP ile yaptıgımız gibi arama sorgumuzu oluşturalım.
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"github.com/elastic/go-elasticsearch/esapi"
"github.com/elastic/go-elasticsearch/v8"
)
func main() {
// Elasticsearch istemcisini oluştur
cfg := elasticsearch.Config{
Addresses: []string{
"http://localhost:9200",
},
}
esClient, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("Error creating Elasticsearch client: %s", err)
}
// Arama sorgusu
query := map[string]interface{}{
"query": map[string]interface{}{
"match": map[string]interface{}{
"content": "Elasticsearch",
},
},
"sort": []map[string]interface{}{
{
"date": map[string]interface{}{
"order": "desc",
},
},
},
}
// Arama isteği
req := esapi.SearchRequest{
Index: []string{"my-index"}, // Arama yapılacak index adı
Body: esClient.Search.WithContext(context.Background()).Index("my-index").BodyJson(query),
}
// Arama isteğini gönder
res, err := req.Do(context.Background(), esClient)
if err != nil {
log.Fatalf("Error searching documents: %s", err)
}
defer res.Body.Close()
// Yanıtı oku
var resMap map[string]interface{}
if err := json.NewDecoder(res.Body).Decode(&resMap); err != nil {
log.Fatalf("Error decoding response: %s", err)
}
// Yanıtı işle ve çıktıyı yazdır
hits := resMap["hits"].(map[string]interface{})["hits"].([]interface{})
for _, hit := range hits {
source := hit.(map[string]interface{})["_source"].(map[string]interface{})
fmt.Println("Title:", source["title"])
fmt.Println("Content:", source["content"])
fmt.Println("Date:", source["date"])
fmt.Println("Views:", source["views"])
fmt.Println()
}
}
Bu makalemde tanımlar ile başlayıp örnekler ile ilerlemeye çalıştım, bu örnekler şekillendirilip daha karmaşık sorgular ve yapılar oluşturulabilir.
Bir sonraki makalemde Elasticsearch Aggregations ile nasıl sorgular oluşturulur onu göreceğiz.
Umarım faydalı olmuştur. Sorularınız var ise lütfen soru sormaktan çekinmeyin. Hoşçakalın.