Windows 7 üzerinde wamp ile sphinx full-text search engine kurulumu ve mysql ile örnek uygulama (videolu anlatım).
Print Friendly
Windows 7 üzerinde wamp ile sphinx full-text search engine kurulumu ve mysql ile örnek uygulama (videolu anlatım)., 7.8 out of 10 based on 18 ratings
VN:F [1.9.22_1171]
Rating: 7.8/10 (18 votes cast)

INDEX’LER

Büyük veri tabanları ile uğraşıyorsak ve verileri hızlı getirebilmek için tablolarımızı indexlememiz gerekir. Aksi takdirde yapacağımız sorguların (query) sonuç verme zamanları onlarca saniye alacaktır. Ufak veriler ile uğraşmış olsak bile tablolarımızı yaparken index kullanmamız da fayda vardır .Bundan dolayı tablolarımızı oluştururken where şartına göre indexlememiz gerekir.

Tabi bunu söylerken her alana index koymak son derece saçma olacaktır. Tabloda kullanacağımız indexlerin fazlalığı, tabloya yapılacak eklemelerin (insert) yavaşlamasının yanında, veri boyutunun çoğalmasına neden olur. MySQL’de performans konusu tamamen bir kitap konusu olamasına rağmen gereksiz index kullanımından kaçınmalıyız.

Not:Oluşturacağımız index’lerde mümkün olduğunca benzersiz veriler yapmaya dikkat ederseniz, yapacağınız sorgu (query) sonuçlarının daha hızlı gelmesine olanak sağlayacaktır. Onun için unique ve primary key‘leri kullanmanızı tavsiye ederim.

FULLTEXT INDEX

Veritabanıyla ilgilenen birçok programcı index’lerin ne işe yaradılarını biliyordur ama CMS (Conent Management System – İçerik Yönetim Sistemi) sistemler oluştururkurken zamanında benim de yaptığım hatalardan bir tanesi LIKE komutunu kullanarak arama yapmaya çalışmaktır.LIKE genel arama komutu olarak kullanılır fakat büyük veriler içerisinde tüm satırları tek tek arayacağından kötü performans sergileyecektir.

Bu sorunu düşünen veri tabanı programlarının mühendisleri, özellikle TEXT ve BLOB alanlar içerisinde kullanılamayan index’lerden farklı bir yapı oluşturmuşlar ve  metin alanlar içerisinde index’leme yapabilen “FULL-TEXT INDEX“i geliştirmişlerdir.  MySQL 5.0 sürümünden itibaren gelen “full-text search” veritabanındaki bir tablonun,istenilen alanları (full-text indeksi eklenmiş alanlar) üzerinde metin bazlı arama yapabiliyoruz. Fulltext search sadece MyISAM tipindeki tablolar üzerinde çalışabilmekte. Ayrıca çok da performanslı olduğu söylenemezPerformans haricinde arama sırasında da çok da esnek olmayan bir yapısı var.

İşte burada Sphinx, Apache Solr gibi Search Engine Server ( Arama motoru sunucusu) devreye giriyor. Bu arama motrolarının yaptığı şey, veritabanından bağımsız çalışarak, verilerin, veritabanından belirli aralıklarda çekilerek indekslenmesi. Sonrasında da kendine gelen arama sorguları esnasında, indekslenmiş kayıtlar içerisinden sonucu kısa sürede vermek. Full-Text Search Engine kullanan büyük oyuncular gittigidiyor Sphinx ve sahibinden.com solr kullanmaktadır. Sphinx ve apache solr karşılaştırma fırsatım olmadı fakat okuduğum yorumlara göre sphinx kurulumu ve yapılandırması daha kolay, solr ise sphinx’e göre daha fonksiyonel fakat kurulum ve yapılandırması daha zor şeklinde.

Sphinx’i kullanabilmek için API’ler de (Php, Python, Java vs) mevcuttur. Ayrıca mysql içerisinden Sphinx Storage Engine ile de arama yapılabilir.

Bu yazıda Sphinx’i windows üzerine kurarak örnek bir tabloyu indeksleyeceğiz. Daha sonra da bu indeks üzerinde sphinx’in client’i ile arama yapacağız.

KURULUM

Sphinx kurulum dosyaları ve örnek database buradan indirebilirsiniz.

Kurulum aşamamaları:

  1. Örnek database’in mysql’e aktarılması.(Büyük Database’leri Mysql de İçe Aktarma)
  2. Sphinx Kurulum ve Config Dosyasının Yapılandırılması
  3. Sphinx’in searchd servis kurulumu
  4. Sphinx php api kullanımı (test amaçlıdır.)
  5. Sphinx Search Windows GUI (Graphic User Interface) – Ayhan BARIŞ

 

Büyük Database’leri Mysql de İçe Aktarma

mysql üzerinde test adında utf8_general_ci karakter setine sahip bir veri tanabanı oluşturalım. Mysql full-text arama özelliğini kullanabilmek için depolama motorunun MyIsam olmak zorunda. Sphinx ise MyISAM, InnoDB, NDB, Archive vb depolama motorlarında full-text indexleme yapabilmektedir. Tablo karakter seti problem yaşamamız için UTF8 olmak zorunda.Oluşturduğumuz veri tabanına  ”SphinxSearchEngine-ExampleDatabase.rar” içerisinde “fimler.sql”  dosyasında bulunan örnek datalarımızı oluşturduğumuz test isimli databese içerisine aktarabilmek için 2 yolumuz var

1.Yol

phpMyAdmin aracılığı ile aktarmak istiyor isek php.ini ayarlarında bir takım değişiklikler yapmamız gerekiyor. Değişiklik yapmadan aktarmaya çalıştığımızda “Muhtemelen çok büyük dosya göndermeyi denediniz. Lütfen bu sınıra çözüm yolu bulmak için belgeden yararlanın.” şeklinde hata alabiliriz.

post_max_size = 750M
upload_max_filesize = 750M
max_execution_time = 5000
max_input_time = 5000
memory_limit = 1000M
max_allowed_packet = 200M (in my.ini)

değişikliği yaptıktan sonra wamp servislerini yeniden başlatıp içe aktarma işlemini gerçekşleştire biliriz.

2. Yol

SphinxSearchEngine-ExampleDatabase.rar” içerisindeki “fimler.sql” dosyasını C:\wamp\bin\mysql\mysql5.5.20\bin altına taşıyalım ve komut satırını yönetici olarak çalıştırdıktan sonra  cd C:\wamp\bin\mysql\mysql5.5.20\bin konumlanalım.”mysql -u root -p test < fimler.sql” komutunu çalıştırdıktan sonra bize parola soracaktır.root kullanıcımız da parola olmadığından dolayı enter diyelim ve aktarma işlemini başlatalım.

 Ben 2.yolu kullanmayı tercih ettim.

 

Sphinx Kurulum ve Config Dosyasının Yapılandırılması

SphinxSearchEngine-ExampleDatabase.rar” içerisinde yer alan sphinx klasörünü c:\wamp\bin klasörü altına taşıyalım.

İndeks için kullanılacak sorguda MUTLAKA unique bir ID kolonu olmalı ve bu kolon sorgunun ilk bölümünde kullanılmalıdır. Aksi takdirde sphinx indeksleme yaparken hata verecektir

Sphinx’de arama yapıldığında sonuç olarak sadece ID getirmektedir. Bu yüzden sorgunun içinde unique bir id kolonu olmalıdır

Sphinx’in yapılandırma dosyası c:\wamp\bin\sphinx\bin\sphinx.conf ’u aşağıdaki şekilde düzenledik :

#
# Minimal Sphinx configuration sample (clean, simple, functional)
#

source src1
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass =
sql_db = test
sql_port = 3306 # optional, default is 3306
sql_query_pre = SET NAMES utf8;
sql_query = \
SELECT * \
FROM filmler

sql_query_info = SELECT * FROM filmler WHERE id=$id
}
index test1
{
source = src1
path = C:/wamp/bin/sphinx/data/test1
docinfo = extern
charset_type = utf-8

}
indexer
{
mem_limit = 256M
}
searchd
{
address = 127.0.0.1
listen = 9312
listen = 9306:mysql41
log = C:/wamp/bin/sphinx/log/searchd.log
query_log = C:/wamp/bin/sphinx/log/query.log
read_timeout = 5
max_children = 30
pid_file = C:/wamp/bin/sphinx/log/searchd.pid
max_matches = 1000
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads # for RT to work
binlog_path = C:/wamp/bin/sphinx/data
}

Source bölümünde bir isim verilerek (source src1) veritabanına nasıl bağlanılacağı ve indekslemede kullanılacak sorgu tanımlanmaktadır. Bu bölümdeki sql_query_pre parametresi ile sphinx veritabanına bağlandığında indekslemeden önce mysql’e hangi sorguyu göndereceği tanımlanmaktadır. Karakter problemleri olmaması için ve veritabanımız UTF8 olduğundan burada “SET NAMES utf8” sorgusu ile karakter set tanımlanıyor. İsteğe göre başka sorgular da tanımlanabilir.

Index bölümünde ise indeksleme işlemini etkileyen özellikler tanımlanır. İndeksleme yapılırken hangi kaynağın kullanılacağı source parametresi ile ve indeksin disk üzerinde nerede tutulacağı ise path ile tanımlanır. html_stripparametresi ile indeksleme yapılırken veritabanındaki HTML tag’lerinin temizlenip temizlenmeyeceği belirlenir. Örneğin tabloda “<a>test</a>” şeklinde bir veri varsa ve “html_strip = 1″ ise veri “test” şeklinde indekslenecektir.charset_type ile veritabanın hangi karakter setinde oluşturulduğu tanımlanır.

charset_table ise indeksleme yapılırken hangi karakterin nasıl indeksleneceğini tanımlar. Sphinx Türkçe karakterleri tanıyamadığı için indeksleme yapılırken bu karakterleri dönüştürmek en mantıklı yoldur. Yukarıdaki tablodan da anlaşıldığı üzere bütün büyük harfler küçük harflere (örneğin A->a) ve Türkçe karakterler latin karşılıklarına (ü->u, ç->c gibi) dönüştürülerek indeksleme yapılıyor. Örneğin Küçük kelimesi kucuk olarak indeksleniyor. Arama yapılırken de sphinx kelimeleri dönüştürerek arama yaptığı için herhangi bir sorun olmamaktadır. Yani aramada “küçük” kelimesi kullanılırsa sphinx bunu “kucuk” kelimesine dönüştürüp aramaları yapıyor.

indexer bölümü ise indeksleme yapan programa limitler tanımlanmaktadır. Burada mem_limit ile indeksleme anında maksimum ne kadar bellek kullanacağı tanımlanmıştır.

searchd, arama için kullanılan programın özelliklerini tanımlamaktadır. address ile hangi IP adresini dinleyeceği, portile de hangi portta çalışacağı tanımlanır. Searchd programının log’larının nerede tutulacağı log ile belirlenir.query_log ise yapılan aramalarla ilgili istatistiklerin tutulacağı dosyanın yerini belirler. pid_file , searchd’nin process id’sinin hangi dosyada tutulacağını gösterir. max_matches ile aramalarda en fazla kaç sonuç döndürüleceği tanımlanır.

İndeksleme yapmak için komut satırını yönetici olarak çalıştırıp ve aşağıdaki komut kullanılır :

c:\wamp\bin\sphinx\bin>indexer –config sphinx.conf test1 –rotate

Yukarıdaki komutta –config ile yapılandırma dosyasının nerede olduğu, en sondaki test1 parametresi ile de indeksin ismi tanımlandı.

Komut çalıştırıldıktan sonra indeksleme yapılmaya başlanacaktır. İşlemin süresi verinin büyüklüğüne ve sorgunun ne kadar kompleks olduğuna göre değişecektir.

Sphinx’in searchd servis kurulumu

ndeksleme tamamlandığında bu indeksi kullanarak aramaları yapmamızı sağlayacak searchd adlı daemon’u çalıştırmalıyız. Bu daemon yapılandırma dosyasında tanımladığımız adres (127.0.0.1) ve portu 9312 (3312 varsayılan) dinlemektedir. searchd servis kurulumunu gerçekleştirebilmek için komut satırını yönetici olarak çalıştırıp ve aşağıdaki komut kullanılır :

c:\wamp\bin\sphinx\bin>c:\wamp\bin\sphinx\bin\searchd –install –config c:\wamp\bin\sphinx\bin\sphinx.conf –servicename SphinxSearch

C:\Sphinx\bin\searchd –install –config C:\Sphinx\sphinx.conf.in –servicename SphinxSearch

Servisi başarı ile yükledikten sonra start edelim. Eğer servisi yükleme aşamasında yazım yanlışı yaparsanız yönetici olduğumuz komut satırında sc delete SphinxSearch komutu ile servisi silebiliriz. Servisi yükleme işleminde hata yaptığımız da servisi servisi başlatma işlemi sırasında aşağıdaki hata karşımıza çıkabilir .

“Could not start the searchd service on Local Computer.
Error 1067: The process terminated unexpectedly.”

Sphinx php api kullanımı

SphinxSearchEngine-ExampleDatabase.rar” içerisinde yer alan www klasörü altında sphinx adındaki klasörü wamp’ın www klasörü altına taşıyalım. Sphinx klasörü içerisindeki “test.php”nin içeriği aşağıdaki gibidir. http://localhost/sphinx/test.php ile çalıştıralım. “test.php” Liebe und Triebe kelimelerini aramaktadır. SphinxSerach servisi başlat madığınızda aşağıdaki gibi hata alabilirsiniz.

Query failed: connection to localhost:9312 failed (errno=10060, msg=Bağlanılan uygun olarak belli bir süre içinde yanıt vermediğinden veya kurulan bağlantı bağlanılan ana bilgisayar yanıt vermediğinden bir bağlantı kurulamadı.).

//
// $Id: test.php 2903 2011-08-04 13:30:49Z shodan $
//

require ( "sphinxapi.php" );

$cl = new SphinxClient ();

$q = "Liebe und Triebe";
$sql = "";
$mode = SPH_MATCH_ALL;
$host = "localhost";
$port = 9312;
$index = "*";
$groupby = "";
$groupsort = "@group desc";
$filter = "group_id";
$filtervals = array();
$distinct = "";
$sortby = "";
$sortexpr = "";
$limit = 20;
$ranker = SPH_RANK_PROXIMITY_BM25;
$select = "";

$cl--->SetServer ( $host, $port );
$cl->SetConnectTimeout ( 1 );
$cl->SetArrayResult ( true );
$cl->SetWeights ( array ( 100, 1 ) );
$cl->SetMatchMode ( $mode );

if ( count($filtervals) )	$cl->SetFilter ( $filter, $filtervals );
if ( $groupby )				$cl->SetGroupBy ( $groupby, SPH_GROUPBY_ATTR, $groupsort );
if ( $sortby )				$cl->SetSortMode ( SPH_SORT_EXTENDED, $sortby );
if ( $sortexpr )			$cl->SetSortMode ( SPH_SORT_EXPR, $sortexpr );
if ( $distinct )			$cl->SetGroupDistinct ( $distinct );
if ( $select )				$cl->SetSelect ( $select );
if ( $limit )				$cl->SetLimits ( 0, $limit, ( $limit>1000 ) ? $limit : 1000 );
$cl->SetRankingMode ( $ranker );
$res = $cl->Query ( $q, $index );

////////////////
// print me out
////////////////

if ( $res===false )
{
	print "Query failed: " . $cl->GetLastError() . ".\n";

} else
{
	if ( $cl->GetLastWarning() )
		print "WARNING: " . $cl->GetLastWarning() . "\n\n";

	print "Query '$q' retrieved $res[total] of $res[total_found] matches in $res[time] sec.\n";
	print "Query stats:\n";
	if ( is_array($res["words"]) )
		foreach ( $res["words"] as $word => $info )
			print "    '$word' found $info[hits] times in $info[docs] documents\n";
	print "\n";

	if ( is_array($res["matches"]) )
	{
		$n = 1;
		print "Matches:\n";
		foreach ( $res["matches"] as $docinfo )
		{
			print "$n. doc_id=$docinfo[id], weight=$docinfo[weight]";
			foreach ( $res["attrs"] as $attrname => $attrtype )
			{
				$value = $docinfo["attrs"][$attrname];
				if ( $attrtype==SPH_ATTR_MULTI || $attrtype==SPH_ATTR_MULTI64 )
				{
					$value = "(" . join ( ",", $value ) .")";
				} else
				{
					if ( $attrtype==SPH_ATTR_TIMESTAMP )
						$value = date ( "Y-m-d H:i:s", $value );
				}
				print ", $attrname=$value";
			}
			print "\n";
			$n++;
		}
	}
}

//
// $Id: test.php 2903 2011-08-04 13:30:49Z shodan $
//

?>

Sphinx Search Windows GUI (Graphic User Interface) – Ayhan BARIŞ

Zend resmi Türkiye grubu php-tr (facebook) kurucularından olan Ayhan BARIŞ’ın geliştirdiği Sphinx GUI searchd başlata bilir, sphinx indexer’ı indexleme yapabilir ve test arama sorgularını gerçekleştire bilirsiniz. Sonuçlardaki “weight=xx” bölümü ise aranan verinin ne kadar çok bulunduğunu gösteren bir puandır. Bu konu başka bir yazıda ayrıca anlatılacaktır.

 

Sphinx ile daha ayrıntılı bilgiye web sayfasından ulaşılabilir : http://www.sphinxsearch.com/

Kaynaklar:

Mehmet Şamlı -Uzmanlar İçin Php

http://blog.salihgiray.com/2008/09/sphinx-search-engine-kurulum-ve-temel.html

http://www.ersindogan.com/php-web-programlama/sphinx-nedir

http://www.gelistiricigunlugu.com/spinx-ile-arama-yapmak/

VN:F [1.9.22_1171]
Rating: -1 (from 3 votes)

Gelen Arama Kelimeleri:

  • windows 7 wamp kurulumu
  • sphinx nasıl arama motoru

Bir Cevap Yazın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>