2 Ağustos 2009 Pazar

Oracle Text - Özel Karakterleri Indeksleme İncelikleri

Oracle text Normalde * = gibi özel karakterleri indekslemez, bunların indekslenmesini siz sisteme index oluştururken bildirmelisiniz. BASIC_LEXER tanımlayarak alfanümerik karakterlerin nasıl indeksleneceğini belirleyebilirsiniz.

Tanımlayabileceğiniz üç tip karakter vardır:

1-) Printjoin Characters: Alfanümerik olmayan bir karakteri indekslenen karakterlerin listesine eklemek için kullanılır. Örnek vermek gerekirse "web-site" kelimesi normalde "website" şeklinde indekslenir. Tire (-) işaretini printjoin listesine eklerseniz artık "web-site" şeklinde indekslenecektir ve website şeklinde sorgular "web-site" sonucunu vermeyecektir.

2-) Skipjoin Characters : Printjoin'in tersi olarak indeslenmemesini istediğiniz alfanümerik olmayan karakterleri tanımlayabilirsiniz.

3-) Diğer karakterler : Satır sonunda bir kelimeyi ayırmak için kullanılan karakteri (-) tanımlamak için continuation; noktalama işaretlerinin indeslenip indekslenmeyeceğini belirtmek için punctuations ; satır sonu karakterini (\n) belirlemek için newline ; u-ü o-ö gibi noktalı noktasız harfleri beraber olarak aramak istiyorsak base_letter; büyük küçük harf ayrımını belirlemek için mixed_case kullanılabilir.


Aşağıdaki AUCTION tablosunun oluşturulduğunu ve bu tablo üzerinde çalıştığımızı varsayalım.



Aşağıdaki şekilde AUCTION tablosuna Oracle Text Indexsi ekliyoruz:

-- set up the special characters as printjoins if you wish to search for them
EXEC CTX_DDL.CREATE_PREFERENCE ('special_chars_lexer', 'BASIC_LEXER');
EXEC CTX_DDL.SET_ATTRIBUTE ('special_chars_lexer', 'PRINTJOINS', '*=-');

-- create an index set and add a sub-index
EXEC CTX_DDL.CREATE_INDEX_SET('auction_iset');
EXEC CTX_DDL.ADD_INDEX('auction_iset','price');

-- Create the combined catalog index on the AUCTION table
DROP INDEX auction_titlex;
CREATE INDEX auction_titlex ON AUCTION(title)
INDEXTYPE IS CTXSYS.CTXCAT
PARAMETERS ('LEXER special_chars_lexer index set auction_iset');

Şimdi bu indekslediğimiz veri üzerinde aşağıdaki sorgulamaları yapıyoruz :

1-) Aşağıdaki sorgu yanlızca yanında boşluk olan Tire "-" işaretli veriyi yani sadece ve sadece "-" işareti varsa sonuç dönüyor.

>> SELECT title, price FROM AUCTION WHERE CATSEARCH(title, '{\-}') > 0;

5 - STAR (*****) CAMERA , 2500

2-) Tire işaretini "-" içeren tüm verileri bulmak için aşağıdaki sorgulamayı yapmak gerekiyor:

>> SELECT title, price FROM auction WHERE CATSEARCH(title, '{*\-*}',)>0;

5-STAR(*****) CAMERA,2500
5-STAR (*****) CAMERA,2500
5 - STAR (*****) CAMERA,2500

3-) Eşittir işaretini "=" içeren tüm verileri bulmak için de benzer şekilde aşağıdaki sorgulamayı yapmak gerekiyor:

>> SELECT title, price FROM auction WHERE CATSEARCH(title, '{*\=*}',)>0;

EQUAL (=) CAMERA,25
=======================================,100
============== Cash ==================,102
============= Success ================,103
============== Cash ==================4,104


4-) Yıldız işaretini "*" içeren tüm verileri bulmak için ise aşağıdaki sorgu işe yaramıyor. Bu sorgu tüm verileri döndürüyor:

>> SELECT title, price FROM auction WHERE CATSEARCH(title, '{*\**}',)>0;

5-) 1 ve 1'den fazla Yıldız işaretini "*" içeren tüm verileri bulmak için ise aşağıdaki gibi bir sorgu yazmak gerekiyor. Bu farkın nedeni CATSEARCH'ün "*" işaretini wildcard olarak kullanması olabilir.

>> SELECT title, price FROM auction WHERE CATSEARCH(title, '{\*} | {\*\*} | {\*\*\*} | {\*\*\*\*} | {\*\*\*\*\*}',)>0;

* STAR CAMERA,2500
444 ** *** ***** 444,101
5-STAR(*****) CAMERA,2500
5-STAR (*****) CAMERA,2500
5 - STAR (*****) CAMERA,2500




Hiç yorum yok: