Oracle Veritabanı üzerinde çok fazla bilinmeyen ancak oldukça güçlü ve kullanışlı özelliklerden biri olan Oracle Text; yapılandırılmış veya yapılandırılmamış metinler üzerinde gelişmiş arama işlemleri yapılmasını sağlayan bir full-text search altyapısıdır. Oracle Text, gelişmiş indeksleme mekanizmaları kullanarak plain text veriler (VARCHAR2, CLOB) ile birlikte binary formatta saklanan dosyalar (BLOB) üzerinde arama, indeksleme ve içerik görüntüleme işlemleri gerçekleştirebilir.
Ayrıca veritabanında saklanan metinlerin içerik bazlı indekslenmesine, hatta işletim sistemi üzerindeki belirli directory’lerde bulunan dökümanların da indekslenerek sorgulanmasına olanak sağlar. Oracle Text; Microsoft Office dökümanları, Adobe PDF, HTML, XML gibi 150’den fazla döküman tipini ve 40’tan fazla dili desteklemektedir.
Genellikle döküman yönetim sistemleri, içerik arama uygulamaları, katalog yapıları ve büyük metin verileri içerisinde belirli kelime veya ifadelerin hızlı şekilde bulunması amacıyla kullanılmaktadır. Oracle Text; web ortamındaki, veritabanındaki veya dosya sistemindeki dökümanların analiz edilmesi, indekslenmesi ve aranması işlemlerinde standart SQL yapısını kullanır.
Oracle Text kullanımında en önemli noktalardan biri, üzerinde arama yapılacak kolon için uygun index tipinin seçilmesidir. Çünkü kullanılacak sorgu tipi ve erişim yöntemi, oluşturulacak Oracle Text index yapısının belirlenmesinde kritik öneme sahiptir.
Full Text Index Çeşitleri
Oracle Text yapısında temel olarak kullanılan üç farklı index tipi bulunmaktadır:
- CONTEXT Indexes
- CTXCAT Indexes
- CTXRULE Indexes
CONTEXT Indexes
CONTEXT index yapısı, yüksek miktarda metin içeren veriler üzerinde full-text search işlemleri gerçekleştirmek için kullanılır. Özellikle PDF, Microsoft Word, HTML, XML gibi büyük döküman içeriklerinin indekslenmesi ve aranması amacıyla tercih edilir.
Bu index tipi transaction bazlı anlık güncellenmez. Veri değişikliklerinden sonra index’in güncellenebilmesi için SYNC işlemi yapılması gerekir.
CTXCAT Indexes
CTXCAT index yapısı daha küçük ve yapılandırılmış text alanları için kullanılır. Genellikle VARCHAR2 tipindeki kolonlar üzerinde hızlı text aramaları yapmak amacıyla tercih edilir.
CONTEXT index’ten farklı olarak CTXCAT index yapısında synchronize işlemi otomatik gerçekleşmektedir. Bu nedenle daha sık güncellenen OLTP tarzı yapılarda kullanım açısından avantaj sağlayabilir.
CTXRULE Indexes
CTXRULE index yapısı daha çok document-based filtering işlemlerinde kullanılmaktadır. Gelen dökümanların belirli kurallara veya text pattern’lerine göre eşleştirilmesi amacıyla tercih edilir.
Kaynak: Oracle Text Documentation
Full Text Search’te Kullanılan Temel Terimler
Phrase Search
Birden fazla kelimenin tam eşleşme şeklinde aranması işlemidir.
“Faruk Çevik”
şeklinde yapılan bir aramada, kelimeler ayrı ayrı değil, tam ifade olarak aranır. Benzer kullanım Google aramalarında da çift tırnak (" ") kullanılarak yapılmaktadır.
Proximity Search
Aranılan kelimelerin birbirine olan yakınlığına göre yapılan arama yöntemidir. Özellikle büyük dökümanlarda belirli kelimelerin birbirine yakın geçtiği içeriklerin bulunmasında kullanılır.
Wildcard Search
Belirsiz karakterler kullanılarak yapılan arama yöntemidir.
Örneğin SQL’de:
LIKE '%TEXT%'
--veya
LIKE 'F_RUK%' şeklindeki kullanımlar wildcard search’e örnektir.
Wildcard kullanımı esnek arama imkanı sağlasa da, özellikle büyük veri setlerinde performansı olumsuz etkileyebilir.
Full Text Index İşlemleri
Create Index
Oracle Text index oluşturulurken kullanılacak index tipi, veri yapısı ve sorgu ihtiyacına göre belirlenmelidir. Özellikle büyük döküman yapılarında genellikle CONTEXT INDEX tercih edilmektedir.
Create Index index_name ON table_name(field_name) INDEXTYPE IS CTXSTS.CONTEXT Index oluşturma işlemi; tablodaki veri miktarına, satır sayısına ve text alanlarının büyüklüğüne bağlı olarak oldukça uzun sürebilir. Özellikle büyük tablolarda bu işlem sırasında ciddi I/O ve CPU kullanımı oluşabileceği unutulmamalıdır.
Bu nedenle index oluşturma işlemi yapılmadan önce bakım zamanı planlanmalı ve işlem süresince oluşabilecek lock ve performans etkileri dikkate alınmalıdır.
Full Text Index Öncesi ve Sonrası Sorgulama
Oracle Text kullanılmadan önce metin aramaları genellikle LIKE operatörü ile yapılmaktadır:
SELECT *
FROM TabloX
WHERE Field_Name LIKE '%FARUK%'; Ancak bu yöntem büyük veri setlerinde performans açısından oldukça maliyetlidir. Çünkü çoğu durumda full table scan oluşmasına neden olur.
Oracle Text index oluşturulduktan sonra ise sorgular aşağıdaki şekilde CONTAINS fonksiyonu kullanılarak yapılmalıdır:
SELECT *
FROM TabloX
WHERE CONTAINS(Field_Name, 'FARUK') > 0; Bu yöntem, Oracle Text index yapısını kullandığı için çok daha performanslı çalışmaktadır.
SCORE Kavramı
Oracle Text içerisinde kullanılan SCORE fonksiyonu, aranan kelimenin ilgili döküman içerisindeki önem derecesini ifade eder.
Bu skor değeri Oracle tarafından kullanılan Salton Formula (TF-IDF benzeri yaklaşım) algoritmasına göre hesaplanmaktadır.
Skorun yüksek olması için:
- Aranan kelimenin ilgili dökümanda sık geçmesi,
- Diğer dökümanlarda ise daha az geçmesi
gerekmektedir.
Örnek kullanım:
SELECT SCORE(1), Field_Name
FROM TabloX
WHERE CONTAINS(Field_Name, 'FARUK', 1) > 0
ORDER BY SCORE(1) DESC; Multi Column Data Store Kullanımı
Bazı durumlarda aramaların yalnızca tek kolon üzerinde değil, birden fazla kolon üzerinde yapılması istenebilir. Oracle Text tarafında bu işlem için MULTI_COLUMN_DATASTORE kullanılmaktadır.
Örneğin aşağıdaki alanlara sahip bir tablomuz olduğunu düşünelim:
- UYE_ID
- TCNO
- ADSOYAD
- EPOSTA
- TELNO
- UYEKAYITIP
Bu alanların tamamında arama yapmak için öncelikle bir preference oluşturulur.
Preference Oluşturulması
BEGIN
ctx_ddl.create_preference(
preference_name => 'my_data_store',
object_name => 'MULTI_COLUMN_DATASTORE'
);
END;
/ Aranacak Alanların Tanımlanması
BEGIN
ctx_ddl.set_attribute(
preference_name => 'my_data_store',
attribute_name => 'COLUMNS',
attribute_value => 'UYE_ID, TCNO, ADSOYAD, EPOSTA, TELNO, UYEKAYITIP'
);
END;
/ Sanal veya Yardımcı Alan Oluşturulması
Bu yapı için index verilecek bir alan gerekmektedir. Bu alan sanal olabilir veya aşağıdaki gibi fiziksel bir kolon da oluşturulabilir.
ALTER TABLE TabloX ADD fti VARCHAR2(1); Multi Column Index Oluşturulması
CREATE INDEX fti_context_text
ON TabloX(fti)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS('DATASTORE my_data_store'); Artık belirlenen tüm kolonlar Oracle Text tarafından indekslenmiş olacaktır.
Örnek Sogu
SELECT *
FROM TabloX
WHERE CONTAINS(fti, 'farukcevik@%') > 0; Bu sorgu indekslenmiş alanlarda belirtilen ifadeyi arayarak sonuçları döndürmektedir.
Oracle Text Synchronization Problemi
Oracle Text tarafında en önemli konulardan biri index synchronization işlemidir.
Tabloya yeni kayıt geldiğinde veya mevcut kayıtlar güncellendiğinde Oracle Text index otomatik olarak güncellenmez. Bu nedenle index’lerin yeniden synchronize edilmesi gerekir.
Synchronization stratejisi belirlenirken aşağıdaki kriterler dikkate alınmalıdır:
- Tablo büyüklüğü
- Insert / update sıklığı
- Sorguların çalışma sıklığı
- Performans beklentisi
Synchronization Yöntemleri
1. SYNC (ON COMMIT)
Bu yöntemde her commit işleminden sonra index otomatik synchronize edilir.
CREATE INDEX fti_context_text
ON TabloX(fti)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS('datastore my_data_store sync(on commit)'); Bu yöntem küçük ve orta ölçekli OLTP sistemlerinde kullanılabilir. Ancak yoğun transaction ortamlarında performans maliyeti oluşturabilir.
2. Trigger Kullanımı
Synchronization işlemi trigger ile de yapılabilir.
CREATE OR REPLACE TRIGGER sync_text_trigger
BEFORE INSERT OR UPDATE OR DELETE
ON TabloX
BEGIN
ctxsys.ctx_ddl.sync_index('fti_context_text');
END;
/ Ancak yüksek transaction ortamlarında trigger kullanımı performans sorunlarına neden olabilir.
3. Oracle Job / Scheduler Kullanımı
En yaygın ve performans açısından en sağlıklı yöntemlerden biri synchronization işlemini belirli periyotlarda çalıştırmaktır.
Örneğin:
EXEC ctx_ddl.sync_index('fti_context_text'); Bu işlem Oracle Scheduler, DBMS_JOB veya Oracle Enterprise Manager üzerinden periyodik olarak çalıştırılabilir.
Özellikle büyük tablolarda ve yoğun sistemlerde en uygun yöntem genellikle scheduled synchronization yaklaşımıdır. Böylece index belirli aralıklarla toplu şekilde güncellenmiş olur ve transaction yükü minimize edilir.
Sonuç olarak Oracle Text, Oracle Database üzerinde gelişmiş full-text search işlemleri gerçekleştirmek için oldukça güçlü ve esnek bir altyapı sunmaktadır. Özellikle büyük metin verileri, döküman yönetimi, içerik arama sistemleri ve çok kolonlu text aramalarında klasik LIKE sorgularına göre çok daha yüksek performans ve gelişmiş arama kabiliyeti sağlamaktadır.
Her ne kadar Elasticsearch, Solr veya OpenSearch gibi bu iş için özel geliştirilmiş arama motorları ve document-based sistemler çok daha gelişmiş search yetenekleri, distributed mimari ve ölçeklenebilirlik avantajları sunsa da; birçok uygulama için Oracle Database içerisinde native olarak gelen Oracle Text altyapısı oldukça etkili şekilde kullanılabilmektedir. Özellikle verinin zaten Oracle üzerinde bulunduğu yapılarda ek bir search platformu kurmadan, mevcut RDBMS altyapısı içerisinde güçlü full-text search ihtiyaçları karşılanabilmektedir.
Doğru index tipinin seçilmesi, synchronization stratejisinin planlanması ve sorguların Oracle Text mimarisine uygun tasarlanması; performanslı ve sürdürülebilir bir full-text search altyapısı oluşturmak açısından kritik öneme sahiptir.
Özellikle büyük veri hacimlerinde CONTEXT INDEX, CONTAINS, SCORE, MULTI_COLUMN_DATASTORE ve synchronization mekanizmalarının doğru kullanılması, Oracle Database üzerinde oldukça gelişmiş arama uygulamalarının geliştirilmesine imkan sağlamaktadır.
Bir sonraki yazıda Oracle Text tarafında kullanılan Lexer, Stoplist, Section Group, Theme Search ve gelişmiş sorgu operatörleri gibi daha ileri seviye özelliklere değineceğim.
Bir yanıt yazın