PHP ile Elasticsearch Kullanimi


elasticsearch

Bu yazida php ile elasticsearch kullanimindan bahsedecegiz. Elasticsearch nedir ne degildir?, nasil kurarim? gibi sorulari hallettigimizi varsayip konuya giriyorum.Oncelikle elasticsearch package’ini composer ile projemize dahil etmemiz gerekiyor, su anki stabil versiyon icin composer.json dosyamiza su sekilde dahil etmemiz yeterli.


"require": {
    "elasticsearch/elasticsearch": "~1.0"
  },

Elasticsearch sunucusuna baglanmak icin;

$client = new ElasticsearchClient(
            array( 'hosts' => array( 'http://localhost:9200') )
        );

sekilinde baglanabiliriz. Tabii http auth benzeri birseyler kullaniyorsaniz. Ona gore yazmaniz gerekiyor. Detaya suradan erisebilirsiniz.

a) Indexleme islemi;

Misal urunler view’unu indexlemek istiyoruz. Binlerce urun oldugu icin bulk index kullanacagimizi varsayalim;


$params['index'] = 'product_index';
$params['type']  = 'product';
//$products'lar view'dan gelen listemiz olsun

foreach ($products as $product) {
   $params['body'][] = array(
           'index' => array( '_id' => $product['ID'])
                      );

                        $params['body'][] = $product;
}
 $responses = $client->bulk( $params );

seklinde view’u indexlemis olduk.

b) Arama islemi

Gelelim arama tarafina; nerede neyi aradigimizi bilmemiz gerekiyor

$params['index'] = 'product_index';
$params['type']  = 'product';

aramayi nasil yapacagimizi kararlastirmamiz gerekiyor. Misal bize gelen parama sorgusu indeximizde hangi alanlarla eslesebilir.

Ornegin arama sorgusu, PRODUCT_NAME,PRODUCT_CODE,PRODUCT_CATEGORY alanlarimizla eslesebilecegini dusunelim.


$searchKey = $_GET['s']; // tabii ki normalde get'den boyle kutuk gibi almiyoruz

// ornegin fuzzy_like_this ile veritabanindaki like benzeri arama yapabiliriz.
$query["fuzzy_like_this"]["like_text"] = $searchKey;
$query["fuzzy_like_this"]["fields"][] = "PRODUCT_NAME";
$query["fuzzy_like_this"]["fields"][] = "PRODUCT_CODE";
$query["fuzzy_like_this"]["fields"][] = "PRODUCT_CATEGORY";

/* multi_match ile birden cok alanin eslesebilecegini belirtebiliyoruz
ancak girilen arama terimi tam olarak eslesmeli */

$query["multi_match"]["query"]    = $searchKey;
$query["multi_match"]["fields"][] = "PRODUCT_NAME";
$query["multi_match"]["fields"][] = "PRODUCT_CODE";
$query["multi_match"]["fields"][] = "PRODUCT_CATEGORY";

// mutlak eslesme istiyorsak, ornegin urun adi ile
$query['bool']['should'] = array(
array('match' => array('PRODUCT_NAME' => $searchKey)),
);

/*
Ornegin aramalarda filtre uygulayacagimizi dusunelim, misal sadece belirli kategoriler icinde arama yapacagiz.
*/
$filter['terms']['CATEGORY_ID'] = $aramaYapacagimizKategoriIdleriArrayi;

$params['body']['query']['filtered'] = array(
                "filter" => $filter,
                "query"  => $query,
);

// gelelim siralama tarafina
// urun adlarina gore ve en yuksek score'a gore siralanmasini istedigimi varsayalim.
$params['body']['sort'] = array( '_score' => array( 'order' => 'desc' ), 'PRODUCT_NAME' => array( 'order' => 'asc' ));

// ve sonunda aramayi yapiyoruz
 $results = $client->search( $params );
 $milliseconds = $results['took']; // aramanin kac ms surdugunu tutar

foreach ($results['hits']['hits'] as $key => $item) {
// artik bulunan eslesmeler $item olarak sizde, bundan sonrasi size kalmis
}

Deneyimlemem sonucu cok buyuk indexler yerine indexleri parcalara ayirip arama yapmak indexleme operasyonu acisindan daha guzel oluyor. Misal 500.000 kayiti tek bir index’e atmakla ugrasacagimiza 50.000’lik partlara ayirip arama yapabiliriz. Sanirim index basi 5mb boyutu gecmemek guzel oluyor.

Bu ornekten yola cikarsak misal parca parca 500.000 urunluk bir view’u 50.000’lik datasetleri halinde product_index_1,product_index_2,product_index_3… seklinde indexledigimizi varsayalim.
Tum indexlerde aramak icin yukaridaki ornekte

$params['index'] = 'product_index*';

seklinde sona wildcard eklememiz yeterli.

Onun disinda suanlik Elasticsearch icin kullandigim, tavsiye ettigim 2 plugin bulunmakta.

Bunlardan birincisi elasticsearch head. Yonetim icin guzel oluyor, clustur durumlari vs.. arabirimden gorebilmek guzel.

Ikincisi de elasticsearch’un onune http auth koymamizi saglayan http-basic plugini. Tabii yinede plugine guvenip network seviyesinde guvenlik onlemleri almamazlik etmeyin 😉

Benim yorumlamam bu sekilde.

Reklamlar

2 thoughts on “PHP ile Elasticsearch Kullanimi

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s