martes, agosto 16, 2005

Búsquedas fuzzy, índices context y gestión documental con Oracle. Parte II.

(Continua a partir de parte I).

Recientemente he estado hablando con gente interesada en la gestión de contenidos de documentos y, en general, la mayoría utiliza formatos PDF. El anterior artículo se basaba únicamente en documentos word, y he creído interesante hacer un ejemplo de como Intermedia realiza la indexación de documentos word y PDF de forma totalmente transparente.

Algo importante a mencionar sobre los índices context es que éstos no se mantienen automáticamente con las inserciones. Hay una causa mayor referente al impacto del rendimiento que tendría dicha reconstrucción. En este caso, se incluyen seis nuevas filas BFILE vinculadas a ficheros PDF existentes en el mismo directorio. Posteriormente a la inserción, es preciso reconstruir el índice para recrearlo con la nueva relación de términos.

Para la implementación completa del ejemplo (creación de la tabla, el índice, el objeto directory y temas relativos a privilegios) es preciso seguir los pasos de la Parte I.



Pasos:

Parte I.

       1.- Creación de una tabla con columna BFILE
       2.- Creación de un DIRECTORY oracle para vincular los documentos Word.
       3.- Concesión de privilegios sobre el DIRECTORY al usuario CTXSYS, propietario de Oracle Context.
       4.- Inserción de las filas en la tabla DOCUMENTOS.
       5.- Indexación de la columna BFILE.
       6.- Ejemplos de consultas.

Parte II.

       7.- Inserción de las filas de documentos PDF.
       8.- Reconstrucción del índice context.
       9.- Ejemplos de consultas.





SQL> host dir c:\documentos
El volumen de la unidad C no tiene etiqueta.
El número de serie del volumen es: 2416-B169

Directorio de c:\documentos

09/05/2005  09:31       <DIR>          .
09/05/2005  09:31       <DIR>          ..
25/04/2005  13:21              271.360 EntornosNoProd_Permisos extendidos.doc
25/04/2005  13:21               31.232 normas_dba.doc
25/04/2005  13:21              379.904 creacion_entorno_bbdd.doc
25/04/2005  13:21              252.928 CREACION_INSTANCIA_DE_ORACLE_EN_UNIX_v2_4.doc              
04/06/2002  21:58            1.479.383 Oracle9i - New Features for Administrators - Vol I.pdf
04/06/2002  21:59            1.542.651 Oracle9i - New Features for Administrators - Vol II.pdf
04/06/2002  21:55            1.244.186 Oracle9i - New Features for Developers - Vol I.pdf
04/06/2002  21:57            2.342.972 Oracle9i - New Features for Developers - Vol II.pdf
04/06/2002  21:13            1.245.254 Oracle9i - New Features Overview - Vol I.pdf
04/06/2002  21:14              801.119 Oracle9i - New Features Overview - Vol II.pdf

10 archivos        9.935.424 bytes
               2 dirs   4.970.479.616 bytes libres


SQL> -- Inserción de los seis documentos PDF sobre la tabla
SQL> -- y recreación del índice CONTEXT
SQL> -----------------------------------------------------------------------------------
SQL> insert into documentos values
  2  (5,'PDF','Oracle9i - New Features for Administrators - Vol I.pdf',
  3  BFILENAME('DOCUMENTOS_WORD','Oracle9i - New Features for Administrators - Vol I.pdf'));

1 row created.

SQL> insert into documentos values
  2  (6,'PDF','Oracle9i - New Features for Administrators - Vol II.pdf',
  3  BFILENAME('DOCUMENTOS_WORD','Oracle9i - New Features for Administrators - Vol II.pdf'));

1 row created.

SQL> insert into documentos values
  2  (7,'PDF','Oracle9i - New Features for Developers - Vol I.pdf',
  3  BFILENAME('DOCUMENTOS_WORD','Oracle9i - New Features for Developers - Vol I.pdf'));

1 row created.

SQL> insert into documentos values
  2  (8,'PDF','Oracle9i - New Features for Developers - Vol II.pdf',
  3  BFILENAME('DOCUMENTOS_WORD','Oracle9i - New Features for Developers - Vol II.pdf'));

1 row created.

SQL> insert into documentos values
  2  (9,'PDF','Oracle9i - New Features Overview - Vol I.pdf',
  3  BFILENAME('DOCUMENTOS_WORD','Oracle9i - New Features Overview - Vol I.pdf'));

1 row created.

SQL> insert into documentos values
  2  (10,'PDF','Oracle9i - New Features Overview - Vol II.pdf',
  3  BFILENAME('DOCUMENTOS_WORD','Oracle9i - New Features Overview - Vol II.pdf'));

1 row created.

SQL> commit;

Commit complete.

SQL> ALTER INDEX idx_documentos_doc REBUILD;

Index altered.

-- Las búsquedas CONTEXT sobre índices domain se realizan con la cláusula CONTAINS
-- más documentación al respecto en   http://download-west.oracle.com/docs/cd/B10501_01/text.920/a96518/cqoper.htm )
------------------------------------------------------------

-- documentos con la palabra 'tablespace' cerca de 'storage'
SQL> select tipo, titulo
  2  from documentos
  3  where CONTAINS(documento, 'tablespace near storage') > 0;

TIPO TITULO
---- ------------------------------------------------------------
PDF  Oracle9i - New Features Overview - Vol II.pdf
PDF  Oracle9i - New Features Overview - Vol I.pdf
WORD Creación de instancia Oracle en UNIX.
WORD Normativa de DBA.


-- documentos con una palabra parecida a 'locally' en un 70%
SQL> select tipo, titulo
  2  from documentos
  3  where CONTAINS(documento, 'fuzzy(locally, 70, 6, weight)', 1) > 0;

TIPO TITULO
---- ------------------------------------------------------------
PDF  Oracle9i - New Features Overview - Vol II.pdf
PDF  Oracle9i - New Features Overview - Vol I.pdf
WORD Creación de un entorno de BBDD.


-- documentos con una palabra parecida a 'locally' en un 60%
-- nota: la palabra LOCAL aparece en estos dos nuevos documentos
SQL> select tipo, titulo
  2  from documentos
  3  where CONTAINS(documento, 'fuzzy(locally, 60, 6, weight)', 1) > 0;

TIPO TITULO
---- ------------------------------------------------------------
PDF  Oracle9i - New Features Overview - Vol II.pdf
PDF  Oracle9i - New Features Overview - Vol I.pdf
WORD Creación de instancia Oracle en UNIX.
WORD Creación de un entorno de BBDD.
WORD Entornos no producción. Permisos extendidos.


-- documentos que hablen sobre 'listener'
SQL> select tipo, titulo
  2  from documentos
  3  where CONTAINS(documento, 'about(listener)') > 0;

TIPO TITULO
---- ------------------------------------------------------------
PDF  Oracle9i - New Features Overview - Vol II.pdf
WORD Creación de instancia Oracle en UNIX.
WORD Normativa de DBA.


-- relevancia de documentos que hablan de 'listener'
-- nota: en 'Normativa de DBA', efectivamente, se habla bastante menos sobre el listener.
SQL> select tipo, CONTAINS(documento, 'about(listener)')||'%' relevancia, titulo
  2  from documentos
  3  where CONTAINS(documento, 'about(listener)') > 0;

TIPO RELEVANCIA TITULO
---- ---------- ------------------------------------------------------------
PDF  41%        Oracle9i - New Features Overview - Vol II.pdf
WORD 91%        Creación de instancia Oracle en UNIX.
WORD 23%        Normativa de DBA.


Más información en http://download-west.oracle.com/docs/cd/B10501_01/text.920/a96518/csql.htm#21732

5 comentarios:

santiago dijo...

Hola Javier, te escribo para ver si me puedes ayudar, ya que estoy realizando un script php que conecta con una bd oracle, el cual me funciona bien, pero quiero que me saque tambien imágenes de tipo bfile que tengo fuera de la bd, en c:/imagenes ,y no se como hacerlo.
Te agradecería mucho tu ayuda y tu tiempo ya que no se como hacerlo.
Un saludo y muchas gracias por todo.

Javier Morales dijo...

Hola Santiago,

Este post habla de gestión documental (documentos WORD y PDF).

Si las imágenes están en ficheros, fuera de la bbdd, el tipo de dato que usas es BFILE, puedes insertarlas del mismo modo que están los INSERT de docs word, con la función BFILE.

Para que Oracle sea capaz de leer en la carpeta c:/imagenes, debes crear un objeto DIRECTORY tal y como he hecho en este post. Una vez hecho, Oracle podrá leer e incorporar desde ahí ficheros independientemente de su formato.

Un BFILE se almacena como un puntero REF a un fichero externo.

Para gestionar las imágenes insertándolas DENTRO de la base de datos como BLOB, así como la consulta con PHP, este enlace te será de gran ayuda. Es un pequeño tutorial de operaciones sobre Oracle con LOB's mediante PHP.

Gracias por tu interés!
Un saludo,

santiago dijo...

De antemano muchas gracias por tu tiempo y ayuda Javier, y perdona que sea aqui donde te pido ayuda sobre los blob pero es que estoy desesperado con el tema.
Por cierto, soy Santiago, he seguido tu consejo y he visitado el enlace que me pones pero sigo sin conseguirlo, y es curioso porque con archivos .txt va todo bien, pero con .gif o .jpg me sale todo en binario, como codificado, es como si no reconociese el formato.
De nuevo te ruego me ayudes a ver si me das la pista al respecto del tema, que ya no se qué mas leer o ver para poder conseguirlo.
Tambien he probado los bfile, y tampoco lo consigo.
Muchas gracias por todo Javier, y un saludo.

Javier Morales dijo...

Hola Santiago,

En el momento en que puedes recuperar el bfile (o incluso un clob), creo que el problema lo estás teniendo en el PHP, por lo que mejor busca la respuesta en un foro de PHP en el que se hable de acceso a bases de datos.

Siento no poder ayudarte en tu problema.

Un saludo,

Sonia dijo...

Hola javier,

tengo una duda. Tengo una tabla con un campo blob y quiero insertar una referencia de un archivo externo. He creado el directorio, he insertado el campo como Empty_Blob(), he utilizado un bfile para coger la referencia...

l_bfile := BFILENAME('DIRECBLOB', 'prueba.txt');
DBMS_LOB.fileopen(l_bfile, Dbms_Lob.File_Readonly);
DBMS_LOB.loadfromfile(l_blob, l_bfile, DBMS_LOB.getlength(l_bfile));
DBMS_LOB.fileclose(l_bfile);

pero al llegar al punto del bfilename, me da un error ORA-22288 y me salta la correspondiente excepción. No sé qué es lo que falla de la ruta.

Podrías orientarme un poco?.. Gracias.

Amazon