RediSearch ışık hızında arama sonuçları — PHP Entegrasyonu

Mahmut Bayri
4 min readSep 22, 2020

RediSearch, Redis üzerine entegre edilmiş bir arama motorudur. Redis tarafından sağlanmayan eşleşmeler, sayısal filtrelemeler gibi bir çok gelişmiş özelliği barındırır.

Bu yazımdaki amaç detaylara girmeden, hızlıca sizin de fikir sahibi olabilmeniz ve deneyimleyebilmeniz için temel bilgiler vermek.

Yazımdaki anlatım sırası şu şekilde olacak

  • Kısaca RediSearch hakkında bilgi
  • Docker imajı ile çalıştırma
  • PHP kütüphanesinin kurulumu
  • Örnek verilerin indirilmesi ve RediSearch’e gönderilmesi
  • Deneme aramaları

RediSearch hakkında bilgi

Redis’in hızı ve kolayca ölçeklenebilir olması yaygın kullanılmasının en büyük sebebi. RediSearch’de oldukça başarılı olan bu yazılımın avantajlarını kullanmaktadır.

Popüler arama motoru olan ElasticSeach’e hız bakımından oldukça fark atmış durumda. Bu makaleden bazı ölçümlere bakabilirsiniz. Sadece hız mı? Elbette değil! RediSearch en önemli özellikleri şöyle sıralanabilir.

  • Dökümanlarda birden fazla alanda kelime araması yapma
  • Performans kaybı olmaksızın incremental indeksleme
  • Indeks anında sıralama verme
  • Karmaşık sorgulamalar
  • Otomatik tamamlanmış öneriler
  • Türkçe dahil birçok dil desteği, kök bazlı arama
  • UTF-8 desteği
  • Diğer özellikler için şu sayfayı ziyaret edebilirsiniz.

Resmi ve topluluklar tarafından geliştirilmiş kütüphanelerle Python, Java, JavaScript, Ruby, Go, C#, PHP gibi bir çok dile destek verir. Desteklenen dilleri şu adreste bulabilirsiniz. https://oss.redislabs.com/redisearch/Clients/#currently_available_libraries

Bu makalede PHP kütüphanesini kullanacağız.

Docker imajı ile çalıştırma

RediSeach, Redis Cloud, Docker üzerinden kullanabileceğiniz gibi kendi makinenize de kurabilirsiniz. Bu makalede kullanımı kolay olduğu için bilgisayarımda fazla iz bırakmadığı için Docker kullanmayı tercih ettim.

Docker kurulu ve çalışır olduğunu varsayıyorum. Boş bir terminalde aşağıdaki komuşu çalıştırın.

Bu komut `https://hub.docker.com/r/redislabs/redisearch` imajının 2.0.0 versiyonunu çekecek ve 6379 portundan kullanılabilir hale getirecek. Yani Host: 127.0.0.1 ve Port: 6379 olacak.

Mevcutta aynı poru kullanan bir redis kullanıyorsanız ya bunu kapatın ya da docker komutundaki `-p 6379:6379` kısmını `-p 6370:6379` gibi bir şey yapın. Bu, docker container içinde 6379 portundan çalışan Redis’e (RediSearch modülü kurulu) host makinenizden `6370` portundan ulaşacağınızı belirtir.

PHP kütüphanesinin kurulumu

https://oss.redislabs.com/redisearch/Clients/ sayfasında önerilen https://github.com/ethanhann/redisearch-php paketini kuracağız.

Öncesinde klasörlerimizi oluşturup paketimizi yüklemeye hazır hale getirelim.

PHP paketini kurmak için aşağıdaki komutu çalıştırın.

http://www.ethanhann.com/redisearch-php/ sayfasına girdiğinizde üç gereksinim göreceksiniz. İlk gereksinimimizi RediSearch uygulamasını Docker üzerinden kullanacağımız için karşılıyoruz. İkinci gereksinim en az PHP 7 versiyonuna sahip olmamız. Son gereksinimde ise Redis’e dolaylı yoldan bağlanmamız için bir paket kullanmamız gerekmesi. Bunu da PHP dünyasında çok popüler olan `predis/predis` paketi ile sağlıyoruz.

Örnek verilerin indirilmesi ve RediSearch’e gönderilmesi

http://snap.stanford.edu/data/wikispeedia.html adresine girecek sayfanın alt kısmındaki 35MB’lık wikispeedia_articles_plaintext.tar.gz dosyasını çekin. Burada bir miktar bilgi var. Bunu test verisi olarak kullacağız. `wikispeedia_articles_plaintext.tar.gz` dosyası içindeki `txt dosyalarını daha önceden oluşturdumuz `plaintext_articles` klasörü içine koyun. Oldukça yüklü 4607 dökümanı RediSearch aramasına vereceğiz.

Dosyalar şu şekilde olmalı:

Bu verileri RediSearch’e indexletmek için `import.php`isimli bir dosya oluşturup içeriğine şunları yazın. Eğer Docker komutunu çalıştırırken farklı bir port verdiyseniz 6379 kısmını değiştirin.

Şu komutla verileri RediSearch’e aktaralım. Bu işlem yaklaşık 40 sn civarında sürecek.

Herhangi bir şekilde bu dosyayı tekrar çalıştırmanız gerekirse var olan index’i silmek için aşağıdaki satırların yorumlarını kaldırın ve tekrar çalıştırın. Daha sonra tekrar yorum satırına dönüştürün.

Bu satırlar mevcut indexi silmeye yarar.

Deneme aramaları

Arama yapmak için içeriği aşağıdaki gibi olan `search.php` dosyası oluşturun. RediSearch oldukça fazla arama seçeneklerine sahip. Aşağıdaki kodda `search` metodunun ilk parametresine bu sorguları uygulayarak arama yapabilirsiniz. https://oss.redislabs.com/redisearch/Query_Syntax/

Aşağıdaki şekilde bu dosyayı çağırdığınızda arama sonuçlarının geldiğini göreceksiniz.

Eğer uzun çıktı veren bir komutunuz var ise belirli bir metne ait satırı görmek isterseniz grep -iRI ile filtreleme yapabiliriniz. Burada yalnızca `kemal` geçen satırları listelemek kullandık.

Biterken

Neler olup bittiğini görmek için https://redislabs.com/redis-enterprise/redis-insight/ RedisInsight aracını kesinlikle yüklemenizi tavsiye ederim. Kurulumu ve bağlantı ayarlarını yaptıktan sonra menüdeki RediSearch kısmna girerek deneme aramaları yapabilirsiniz.

Bu yazımdaki amacım henüz tanışmamış olanlar için RediSearch hakkında bilgiler verip örnek bir çalışma ortamını anlatmaktı. Nasıl çalıştığı, çeşitli analizler, karşılaştırmalar gibi paylaşımlarımı daha sonraki yazılarımda bulabilirsiniz.

Referanslar

--

--