Fatih Özdemir tarafından yazıldı
Full Text Search Nedir?:
Bilişim dünyasında veritabanı kullanmış veya veritabanıyla işlem yapmış herkes index kelimesini duymuştur. Index in veritabanındaki kullanımını hemen bir örnekle açıklayalım. Mesela epeyce kalın kaufmann?ın eski pascal türü bir kitap aldınız ve kitabın içinde bir şeylere bakacaksınız, 1000 sayfalık kitabın her sayfasını tek tek çevirmek epeyce uzun ve zahmetli bir iş. Bunun için kitabın hemen başındaki indexine bakarız ve hızlıca göz gezdirip aradığımız konunun hangi sayfada olduğunu bulup direkt o sayfayı açarız.Aynen bu örnekte olduğu gibide databaselerde verileri kendilerine özel algoritmalarla indexler ve o veriye gitmek gitmek istendiğinde bu indexleri kullanarak o satırı bulur.Full Text Index ise indexlenmek istenen alan eğer text içeriyorsa ki bu bir html dosyası pdf de olabilir, bu tip verileri indexlemek için kullanılır.
Mesela bir gazetecesiniz ve 10 yıllık tüm gazetelerde çıkmış ?ekonomik kriz? kelimelerini bulmak istiyorsunuz. Karşınızdaki datanın büyüklüğünü bir gözünüzün önüne getirin. Burada hemen aklınıza şu soru gelebilir google bunu peki nasıl yapıyor? Google Search?ün arkasında kullanılan index algoritmasının kesinlikle çok büyük önemi var fakat bu algoritmanın kullandığı arkada yüz binlerce server olduğunu unutmamak gerekir. Halbuki siz şirketinizde yada web sayfanızda arama yaparken 1-2 bilgisayar ile yetinmek zorundasınız. Onun için şimdilik google ile boy ölçüşmeye kalkışmamak gerekJ
Bu devasa text datalarını işe yarar şekilde indexlenmesine full text index denir. Burarada işe yarar şekilde kelimesi önemli bunu dokümanın ilerleyen kısımlarında anlatacağım. Her database?in kendine has bir full text algoritması ve kullanım biçimi var. Ben bu dokümanda Oracle Full Text nedir ne değildir biraz bahsetmeye çalışacağım ve bunu soru cevap şeklinde yapacağım. Dokümanın bundan sonra kısımlarında Full Text Index FTI olarak kısaltılacaktır.
FTI çeşitleri
Oracle da 3 çeşit index çeşidi vardır bunlar
CONTEXT Indexes
CTXCAT Indexes
CTXRULE Indexes
Bu indexlerin ne manaya geldiğine bakalım.
Context Indexes : Bu index çok yüksek miktarda text içeren datalar için kullanılır. Örneğin pdf,word,html gibi datalar için.
CtxCat Indexes : Bu index contexte göre daha az olan text alanlar i.in kullanılır. Örneğin varchar2 tipinde bir field için bu index kullanılabilir. CtxCat index için synchronize işlemi gerekmez bu otomatik olarak yapılır.
CtxRule Indexex : Daha çok document based indexlerde kullanılır. Detaylı bilgi için aşağıdaki adresi ziyaret edebilirsiniz.
www.oracle- base.com/articles/9i/FullTextIndexingUsingOracleText9i.php#CONTEXTIndex es
FTI de kullanılan terimler ve açıklamaları
Keyword: Arama yapmak için kullandığımız kelime veya kelimeler için kullanıyoruz
Phrase Search : Aramaya yaparken belli kelimelerin bütününü aramak için kullanılır. ?Fatih Özdemir? kelimelerini beraber aramak gibi. Genellikle aranacak kelimelerin başına sonuna ? koyarak aradığınızda arama motorları phrase search yapar. Oracle?da bunu destekliyor.Proximity Search : Aranılan kelimeler arasında yakınlığa bakarak yapılan aramadır. Bir çok arama motoru bu özelliği desteklemektedir(Yahoo,Google).
Örneğin :
?uncle * bob? OR ?bob * uncle? aramasını yazdığınızda uncle ile bob ve uncle ile bob arasında en fazla 2 kelime olacak şekilde arama sonucu döner.
Wildcard Search : Arama yaparken bir harfin yerine geçecek bir karakter kullanılarak yapılan aramalardır.
Örneğin Kara* Bu aramanın sonucunda Karadeniz,Karabük,Karaman
vb sonuçlar dönecektir
Wildcard search aramayı yavaşlatıcı bir tekniktir.
FTI İşlemleri
Create Index
CREATE INDEX index_name ON table_name(field_name) INDEXTYPE IS CTXSYS.CONTEXT
En basit şekilde bir tablodaki bir alana fti yukarıdaki sql ile atılır. Burada field_name alanı ile verilen field text bir field olmak zorunda yani bu sql doğal olarak numeric bir field için çalışmaz zaten hata verecektir.
Bu sql execute olduğunda tablodaki satır sayınıza ve alan içinde text in büyüklüğüne göre epeyce sürebilir. Onun için böyle bir sqli çalıştırmadan önce iki kere düşünün zira database?i lock edebilirsiniz ve bu tabloyu kullanan tüm yazılımlarınız durabilir.
Querying
Normalde fti atılmamış bir text alanda sorgulama yapmak şöyle bir sql kullanırız:
SELECT * FROM table_name WHERE field_name LIKE ?%FATIH%?
Fti atıldıktan sonraki sorgumuz artık şöyle olacaktır:
SELECT * FROM table_name WHERE CONTAINS(field_name,?FATIH?)>0
Score
Score operatörü etxt içinde geçen kelimelerin sıklıklarına göre size bir değer döndürür. Örneğin haebrler tablosundaki title alanında ?java? kelimesini arıyorsunuz.
title ?java is best language? olan ve ?i like java. java is best language? olan 2 satır var
bu sorguda score operatörü kullanırsanız satırlardan birinde daha fazla java geçtiği için onun score?u daha yüksek dönecektir.
SELECT score(1),title FROM news WHERE CONTAINS(title,?JAVA?,1)>0
Bu sorguda contains?in içinde kullandığımız 1 rakamı label için verilmiş bir değerdir. Score kullanırken de burada yazdığımız değeri kullanıyoruz. Başka bir örnek yapalım. Bu örnekte double contains nasıl kullanılır onu göstermeye çalıştım.
SELECT score(1),title,score(2),body FROM news WHERE CONTAINS(title,?JAVA?,1)>0
OR CONTAINS(body,?ORACLE?,2)>0
Alter Index
Bir fti indexin adını değiştirmek için aşağıdaki sqli çalıştırmanız yeterlidir.
ALTER INDEX index_name RENAME TO new_index_name;
Bir fti indexin parametrelerini değiştirmek yada rebuild etmek için kullanılan ALTER INDEX REBUILD syntax?ını dokümanın ilerleyen bölümlerinde inceleyeceğiz.
Drop Index
Aşağıdaki sql ile atılan indexi kaldırabilirsiniz. Kaldırma işlemi atılan index ne kadar büyük olursa olsun çok uzun sürmez saniyeler içerisinde index drop edilir.
DROP INDEX index_name
FTI Elementleri
Fti için kullanılan tüm elementleri ve parametreleri bu dokümanda anlatamayacağım çünkü epeyce uzun bir doküman olur. Ben çok sık kullanılan genel elementlerden bahsedeceğim.
Multi_Column_Data_Store
Bir databasede birden fazla alanda arama yapmak istiyorsak bu elementi kullanıyoruz. Hemen örnekle açıklayalım
News adında bir tablo var ve bu tablonun title,headline,writer,body adından alanları olsun. Aramayı tüm bu alanların hepsinde birden yapmak istiyorum. Bunun nasıl olacağına bakalım
Önce my_multi_datastore adında bir preference oluşturuyorum.
ctx_ddl.create_preference('my_datastore', 'MULTI_COLUMN_DATASTORE');
Daha sonra bu oluşturduğum multi_colum_datastore preference olan my_datastore?a beraber kullanmak istediği alanlari attribute olarak ekliyorum.
ctx_ddl.set_attribute('my_datastore','COLUMNS','ti tle,headline,writer,body')
Sonra bu alanların hepsini sorgulamak için kullanacağımız dummy bir field oluşturuyoruz. Index atarken bu dummy alanı kullanacağız. Aslında bu field s**** sadece bizim diğer fieldları tek bir field üzerinden sorgulayabilmemiz için gerekli. Bu dummy alan değiştiğinde index syncronize triggeri yazılmışsa çalışır.
ozdemirfatih@hotmail
www.codeclever.org - Ana Sayfa
Kaynak: bilisimnews.com