Day 28: Menampilkan Apa Yang Ditemukan Oracle Text

Learning In HomeOriginal Date: 9 Februari 2009

Untuk melihat hasil filter dokumen yang berada dalam format bukan teks, aku dapat menggunakan API ctx_doc.filter seperti contoh berikut:

DECLARE
  hasil_filter CLOB;
BEGIN
  ctx_doc.filter(
    'IDX_DOC_ATTACHMENT', 
    'AAANiLAAEAAAAL/AAA', 
    hasil_filter);
  dbms_output.
    put_line(hasil_filter);
END;
/

Pada contoh diatas, aku menampung hasil filter dari sebuah baris berdasarkan ROWID ke sebuah variabel CLOB. Jika blok di atas dijalankan, aku akan memperoleh isi file MS-WORD (DOC) dalam bentuk HTML.

Untuk mencari tahu kata apa saja yang sesuai dengan ekspresi pencarian, aku dapat menggunakan API ctx_doc.markup seperti pada contoh berikut:


DECLARE
  hasil_markup CLOB;
BEGIN
  ctx_doc.markup(
    'IDX_DOC_ATTACHMENT', 
    'AAANiLAAEAAAAL/AAA',
    'about(exam)',
    hasil_markup, true);
  dbms_output.
    put_line(hasil_markup);
  dbms_lob.
    freetemporary
    (hasil_markup);
END;
/

Contoh di-atas akan memberi tanda pada kata yang mendekati exam, dimana hasil outputnya seperti berikut:


My name is Solid Snake. I’m here to write down something. I hope I can pass the <<<exam>>> in the examination.
Iklan

Day 27: Index Categori dan Rule di Oracle Text

Learning In HomeOriginal Date: 8 Februari 2009

Setelah menggunakan index CONTEXT di hari sebelumnya, hari ini aku akan mencoba latihan menggunakan index CTXCAT. Aku akan mulai dengan membuat index set terlebih dahulu:


BEGIN
 ctx_ddl.create_index_set
   ('idx_set_barang');
 ctx_ddl.add_index
   ('idx_set_barang', 
    'harga');
 ctx_ddl.add_index
   ('idx_set_barang', 
    'harga,kategori');
 ctx_ddl.add_index
   ('idx_set_barang', 
    'kategori');
END;
/

Aku membuat index dengan menggunakan perintah seperti ini:


CREATE INDEX idx_barang ON tbl_barang(nama)
INDEXTYPE IS CTXSYS.CTXCAT
PARAMETERS ('index set idx_set_barang');

Setelah itu, aku siap mencoba query yang memakai category search, seperti:


SELECT * FROM TBL_BARANG WHERE CATSEARCH(nama, 'Intel', 'harga<3000000') > 0;

Query di atas akan mencari nama yang mengandung kata Intel (case insensitive) dimana harga berada di bawah 3000000. Contoh query lainnya yang memakai category search, misalnya:


SELECT * FROM TBL_BARANG WHERE CATSEARCH(nama, 'intel', 'harga<3000000 and kategori = 3') > 0;


SELECT * FROM TBL_BARANG WHERE CATSEARCH(nama, 'geforce', 'order by harga') > 0;

Selanjutnya, aku akan mencoba memakai index CTXRULE yang dapat dipergunakan untuk klasifikasi teks. Misalnya, aku menyiapkan tabel berikut:


CREATE TABLE TBL_KATEGORI_TEXT (
  ID NUMBER(10),
  KATEGORI VARCHAR2(100),
  EKSPRESI VARCHAR2(100)
);

INSERT INTO TBL_KATEGORI_TEXT VALUES 
 (1, 'Hero', 
  'Spiderman or Wolverine or Dr.Strange');

INSERT INTO TBL_KATEGORI_TEXT VALUES 
 (2, 'Villain', 
  'Octopus or Dr.Doom or Magneto');

CREATE INDEX idx_kategori_text ON 
  tbl_kategori_text (ekspresi) 
  INDEXTYPE IS ctxsys.ctxrule;

Lalu, aku dapat memberikan query berikut:


SELECT kategori FROM TBL_KATEGORI_TEXT WHERE MATCHES(ekspresi, 'dr.doom')>0;

yang akan mengembalikan nilai Villain.

Day 26: Oracle Text

Learning In HomeOriginal Date: 7 Februari 2009

Oracle Text adalah fitur database Oracle yang menangani query yang berkaitan dengan teks. Sebelum menggunakan Oracle Text, aku memastikan user database telah memiliki role CTXAPP, dan berhak menjalankan isi package CTX_CLS, CTX_DDL, CTX_DOC, CTX_OUTPUT, CTX_QUERY, CTX_REPORT, dan CTX_THES.

Aku memiliki beberapa pilihan jenis index saat menggunakan Oracle Text. Untuk meng-index kolom yang terdiri atas teks dalam jumlah besar dan dalam format tertentu, misalnya HTML dan Work, aku dapat menggunakan index CONTEXT. Untuk meng-index teks yang tidak terlalu banyak dan dapat menyertakan kolom lain dalam pencarian, aku menggunakan index CTXCAT. Index CTXRULE dibangun berdasarkan query dari tabel lain. Index CTXXPATH dipakai untuk kolom bertipe XMLType yang menampung data XML.

Sebagai latihan pertama, aku akan menyimpan beberapa Microsoft Word (DOC) ke dalam sebuah folder. Index berjenis CONTEXT mendukung pencarian teks terhadap file yang disimpan di luar tabel seperti ini. Aku mulai dengan membuat data storage preference yang berisi lokasi penyimpan file DOC:


BEGIN
  ctx_ddl.
    create_preference(
      'storage_doc_attachment', 
      'FILE_DATASTORE');
  ctx_ddl.
    set_attribute(
      'storage_doc_attachment', 
      'PATH', 
      'C:\DOC');
END;
/

Karena format dokumen yang aku pakai adalah format Microsoft Word (DOC), maka aku memakai filtering INSO_FILTER yang juga mendukung PDF dan MacWriteII. Dengan demikian, perintah untuk membuat index CONTEXT dalam latihan-ku ini akan menjadi:


CREATE INDEX IDX_DOC_ATTACHMENT ON TBL_ATTACHMENT(ATTACHMENT) INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('DATASTORE storage_doc_attachment FILTER ctxsys.inso_filter');

Lalu, aku menempatkan beberapa file Microsoft Word (DOC) ke folder C:\DOC, kemudian menambahkan record baru ke tabel serta me-rebuild index:


INSERT INTO TBL_ATTACHMENT 
  VALUES (1, 'document1.doc');
INSERT INTO TBL_ATTACHMENT 
  VALUES (2, 'document2.doc');
INSERT INTO TBL_ATTACHMENT 
  VALUES (3, 'document3.doc');
ALTER INDEX IDX_DOC_ATTACHMENT 
  REBUILD;

Sekarang, aku siap untuk menguji Oracle Text, misalnya dengan query berikut:


SELECT * FROM TBL_ATTACHMENT WHERE CONTAINS(attachment, 'exam') > 0;

Salah satu kelebihan Oracle Text ketimbang query dengan operator LIKE adalah kemampuannya mengenali kata. Query di atas hanya akan mencari dokumen Word yang mengandung kata “exam” saja, tidak termasuk “examination”.