Oracle Full Text Indexing And Searching

November 3, 2008

Oracle teks, sebelumnya dikenal sebagai Intermedia teks dan konteks, teknologi pengindeksan berbasis teks yang memungkinkan Anda untuk meng-indeks secara efisien berbasis teks dan menghasilkan teks dokumen klasifikasi aplikasi. Pada artikel ini saya hanya akan menulis beberapa fitur ini.

 

  • Konteks Indeks
  • CTXCAT Indeks
  • CTXRULE Indeks
  • Indeks Pemeliharaan

 

Contoh dalam artikel ini memerlukan grant ke package  CTX_DDL,  sebagai berikut: 

GRANT EXECUTE ON CTX_DDL TO <username>;

Konteks Indeks

CONTEXT indeks digunakan untuk indeks jumlah besar teks seperti Word, PDF, XML, HTML atau teks dokumen. Dalam contoh ini kita akan menyimpan data dalam BLOB kolom, yang memungkinkan kita untuk menyimpan binari dokumen seperti Word dan PDF serta teks biasa.  Pertama kita buat sebuah contoh skema untuk menampung data kita, sebagai berikut :
DROP TABLE my_docs;
DROP SEQUENCE my_docs_seq;
DROP PROCEDURE load_file_to_my_docs;

CREATE TABLE my_docs (
  id    NUMBER(10)     NOT NULL,
  name  VARCHAR2(200)  NOT NULL,
  doc   BLOB           NOT NULL
)
/

ALTER TABLE my_docs ADD (
  CONSTRAINT my_docs_pk PRIMARY KEY (id)
)
/

CREATE SEQUENCE my_docs_seq;

CREATE OR REPLACE DIRECTORY documents AS 'C:\work';

Kemudian kita load beberapa file, sebagai berikut :

CREATE OR REPLACE PROCEDURE load_file_to_my_docs (p_file_name  IN  my_docs.name%TYPE) AS
  v_bfile      BFILE;
  v_blob       BLOB;
BEGIN
  INSERT INTO my_docs (id, name, doc)
  VALUES (my_docs_seq.NEXTVAL, p_file_name, empty_blob())
  RETURN doc INTO v_blob;

  v_bfile := BFILENAME('DOCUMENTS', p_file_name);
  Dbms_Lob.Fileopen(v_bfile, Dbms_Lob.File_Readonly);
  Dbms_Lob.Loadfromfile(v_blob, v_bfile, Dbms_Lob.Getlength(v_bfile));
  Dbms_Lob.Fileclose(v_bfile);

  COMMIT;
END;
/

EXEC load_file_to_my_docs('FullTextIndexingUsingOracleText9i.doc');
EXEC load_file_to_my_docs('FullTextIndexingUsingOracleText9i.asp');
EXEC load_file_to_my_docs('XMLOverHTTP9i.asp');
EXEC load_file_to_my_docs('UNIXForDBAs.asp');
EXEC load_file_to_my_docs('emp_ws_access.sql');
EXEC load_file_to_my_docs('emp_ws_test.html');
EXEC load_file_to_my_docs('9ivsSS2000forPerformanceV22.pdf');

Kemudian kita buat sebuah indeks dengan tipe CONTEXT di kolom dokumen dan gabungkan dengan tabel statistik, sebagai berikut :

CREATE INDEX my_docs_doc_idx ON my_docs(doc) INDEXTYPE IS CTXSYS.CONTEXT;

EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'MY_DOCS', cascade=>TRUE);

Terakhir kita buat query untuk mencari dokumen dengan isi yang spesifik:

SELECT SCORE(1) score, id, name
FROM   my_docs
WHERE  CONTAINS(doc, 'SQL Server', 1) > 0
ORDER BY SCORE(1) DESC;

     SCORE         ID NAME
---------- ---------- ------------------------------------------------
       100        127 9ivsSS2000forPerformanceV22.pdf

1 row selected.

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=2 Bytes=58)
   1    0   SORT (ORDER BY) (Cost=4 Card=2 Bytes=58)
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'MY_DOCS' (Cost=2 Card=2 Bytes=58)
   3    2       DOMAIN INDEX OF 'MY_DOCS_DOC_IDX' (Cost=0)

SELECT SCORE(1) score, id, name
FROM   my_docs
WHERE  CONTAINS(doc, 'XML', 1) > 0
ORDER BY SCORE(1) DESC;

     SCORE         ID NAME
---------- ---------- ------------------------------------------------
        74        123 XMLOverHTTP9i.asp
         9        125 emp_ws_access.sql

2 rows selected.

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=2 Bytes=58)
   1    0   SORT (ORDER BY) (Cost=4 Card=2 Bytes=58)
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'MY_DOCS' (Cost=2 Card=2 Bytes=58)
   3    2       DOMAIN INDEX OF 'MY_DOCS_DOC_IDX' (Cost=0) 

Ikuti

Get every new post delivered to your Inbox.