sphinx

Sphinx ile Arama Yapmak

Sphinx Nedir ? Sphinx  C++ ile kodlanmış olup Linux, Windows, MacOS gibi popüler işletim sistemleri ile çalışabilen arama motoru (full text search engine) olarak tanımlanır.Veritabanı olarak MySQL ve PostreSQL ile çalışabilir.Çoğu programlama dili (PHP, Java, ASP.net, Python) için API ı mevcuttur. Temel Çalışma Prensibi : Yüklü sistemlerde en zor iş arama işleridir.Hele ki yapılan bu arama […]

Sphinx Nedir ?

Sphinx  C++ ile kodlanmış olup Linux, Windows, MacOS gibi popüler işletim sistemleri ile çalışabilen arama motoru (full text search engine) olarak tanımlanır.Veritabanı olarak MySQL ve PostreSQL ile çalışabilir.Çoğu programlama dili (PHP, Java, ASP.net, Python) için API ı mevcuttur.

Temel Çalışma Prensibi :

Yüklü sistemlerde en zor iş arama işleridir.Hele ki yapılan bu arama kelime araması ise tablonun büyüklüğüne göre işlemler bir o kadar zorlaşır.Örnek vermek gerekir ise mesela MySQL için tablo yapısını MYISAM yaparak belirli alanlara full text index atmanız gerekir.

Bunun yerine Sphinx te işler şöyle ilerliyor.Önce Sphinx ile indexlenecek veriyi indexliyoruz.Bu indexler sisteminizin yoğunluğuna verinin aktif olma süresine göre oluşturulur.

Sonrasında oluşturulan bu indexlenmiş veri üzerinde arama yapılır ve sphinx size uygun kriterlere göre primary key veya istediğiniz bir key değerleri döner.Daha sonra bu  değerlere  göre aranılan veri DB den veya istenilen başka bir kaynaktan sağlanır.

Kurulum : 

Kullandığım işletim sistemi Ubuntu olduğu için buna göre anlatacağım.

sudo apt-get install sphinxsearch

komutu ile Ubuntu üzerine çok rahat kurulum yapabilirsiniz.Sphinx bir konfigürasyon dosyası içerir ve Ubuntu için bunun konumu varsayılanda şu şekildedir:

/etc/sphinxsearch/sphinx.conf

Bu konfigürasyon dosyasında Sphinx i yönetebileceğimiz parametreler yer alır.Bu dosya temel olarak 4 bölümden oluşur:

source : Veri kaynağının tanımını yapılır.
index: Veriler için index ayarları bulunur.
indexer:  İndex mekanizmasının parametrelerini bu bölümde tutulur.
searchd: Searchd servisinin parametreleri bu bölümde tutulur.

Örnek için hazırladığım konfigürasyon dosyası şu şekilde :

source src1
{
type = mysql
sql_host = localhost
sql_user = test
sql_pass =
sql_db = test
sql_port = 3306 # optional, default is 3306
sql_query = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents
sql_attr_uint = group_id
sql_attr_timestamp = date_added
sql_query_info = SELECT * FROM documents WHERE id=$id
}

index test1
{
source = src1
path = /var/lib/sphinxsearch/data/test1
docinfo = extern
charset_type = sbcs
}

indexer
{
mem_limit = 32M
}

searchd
{
port = 9312
log = /var/log/sphinxsearch/searchd.log
query_log = /var/log/sphinxsearch/query.log
read_timeout = 5
max_children = 30
pid_file = /var/run/searchd.pid
max_matches = 1000
seamless_rotate = 1
preopen_indexes = 0
unlink_old = 1
}

Basitçe bu dosyada src1 isminde bir source oluşturduk.Bu kısımda indexlenecek veri için veritabanı bağlantı ayarları, indexlenecek sorguyu ve index oluşturulacak alanlar ve index tiplerini belirledikç

Sonrasında index bölümünde bu verinin indexleme ayarlarını belirledik. Hangi kaynak kullanılacak, diskin hangi bölümü kullanılacak gibi ayarlar bu kısımda tutuluyor.

Indexer kısmında  indexleyicinin belirli ayarlarını tutuyoruz.

Son olrak searchd kısımında searchd servisinin ayarları tutulur.Loglar nereye yazılacak vs timeout gibi.

Örnek için gerekli mysql dump  :

DROP TABLE IF EXISTS test.documents;
CREATE TABLE test.documents
(id INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT,
group_id INTEGER NOT NULL,
group_id2 INTEGER NOT NULL,
date_added DATETIME NOT NULL,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL);
REPLACE INTO test.documents ( id, group_id, group_id2, date_added, title, content ) VALUES
( 1, 1, 5, NOW(), 'test one', 'this is my test document number one. also checking search within phrases.' ),
( 2, 1, 6, NOW(), 'test two', 'this is my test document number two' ),
( 3, 2, 7, NOW(), 'another doc', 'this is another group' ),
( 4, 2, 8, NOW(), 'doc number four', 'this is to test groups' );
DROP TABLE IF EXISTS test.tags;
CREATE TABLE test.tags
(
docid INTEGER NOT NULL,
tagid INTEGER NOT NULL,
UNIQUE(docid,tagid)
);
INSERT INTO test.tags VALUES
(1,1), (1,3), (1,5), (1,7),
(2,6), (2,4), (2,2),
(3,15),
(4,7), (4,40);

Son olarak indexer ı çalıştırıyoruz :

sudo indexer test1

Aşağıdaki gibi arama yapabilirsiniz.

search "test"

Sphinx i php veya herhangi başka bir dil için yazılmış olan client’ını indirerek web projelerinizde çok rahat kullanabilirsiniz.

Daha detaylı bilgi için  : buraya bakınız.