Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Temas relacionados > Redes
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-09-2012
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Cita:
Empezado por elaguna Ver Mensaje
...sólo que los equipos clientes son todo Microsoft y los usuarios no tienen tiempo (ni ganas!!) de aprender como cambiar el formato de su archivo...
Si lees bien mi mensaje anterior verás que indiqué que el proceso de extracción debería ser automatizado. Veámos cual sería la secuencia (siguiendo la recomendación de mamcx).
  • El usuario carga el archivo al sistema
  • El sistema extrae extrae la metadata y texto del archivo (basándonos en como loook hace la búsqueda)
  • Se almacena esta info en la BD, junto con la referencia al archivo original (¿path?)
Y al hacer búsquedas
  • EL usuario ingresa un término de búsqueda
  • Se hace la búsqueda en la bd (texto plano del doc)
  • Al encontrar un match, se devuelve el archivo original (.docx)
De esta forma, en la bd tendrías un texto plano que simplificaría las búsquedas y al usuario de devuelves el archivo original.

Saludos
Responder Con Cita
  #2  
Antiguo 14-09-2012
Avatar de elaguna
elaguna elaguna is offline
Miembro
 
Registrado: abr 2009
Ubicación: México
Posts: 51
Poder: 16
elaguna Va por buen camino
Solucionado

Muchas gracias a todos los que se tomaron el tiempo de leer, pero principalmente gracias a los que aportaron ideas.

Entre que ya había logrado sacar la información de los Word y con las sugerencias de mamcx y de D-MO se solucionó el problema, además de otra solución colateral.

Del modo en que en un principio lo estaba haciendo, mantenía oculto Word y realizaba las búsquedas en cada uno de los archivos, pero si mientras se ejecutaban las búsquedas, abrías Word entonces se quedaba abierto permanentemente o se cerraba (según la parte de código que se estuviera ejecutando) y se mostraba todo el proceso, pero no dejaba trabajar en ningún otro archivo (algo faltó por ahí al instanciar ).

Con la solución final, como todo se hace en el servidor, es mucho más rápido y no "molestamos" a Microsoft con nada.

Gracias a todos. Son geniales!!!

Eduardo Laguna
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda)
Responder Con Cita
  #3  
Antiguo 15-09-2012
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Me alegra saber que sirvió de algo las aportaciones que se hicieron. Sería bueno que detallaras un poco mas de como quedó el proceso final para que nos sirva de retroalimentación.

Saludos
Responder Con Cita
  #4  
Antiguo 15-09-2012
Avatar de elaguna
elaguna elaguna is offline
Miembro
 
Registrado: abr 2009
Ubicación: México
Posts: 51
Poder: 16
elaguna Va por buen camino
Cita:
Empezado por D-MO Ver Mensaje
Me alegra saber que sirvió de algo las aportaciones que se hicieron. Sería bueno que detallaras un poco mas de como quedó el proceso final para que nos sirva de retroalimentación.
Claro que sí, en este momento todavía estoy modificando este "busca lo que te digo", pero en un momento más lo subo y gracias de nuevo.

Eduardo Laguna
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda)
Responder Con Cita
  #5  
Antiguo 15-09-2012
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
No te apures, que no hay prisa
Responder Con Cita
  #6  
Antiguo 19-09-2012
Avatar de elaguna
elaguna elaguna is offline
Miembro
 
Registrado: abr 2009
Ubicación: México
Posts: 51
Poder: 16
elaguna Va por buen camino
Solucionado (definitivamente)

Pues como quedamos, esta es la solución que implemente para las búsquedas.

1. Modifiqué mi tabla en la DB (Postgresql) para almacenar al contenido de cada documento. Mi tabla se llama "planti_corr", agregué un campo de texto e indexé la tabla por ese campo siguiendo lo indicado por mamcx y en la documentación http://www.postgresql.org/docs/9.1/s...extsearch.html

Código SQL [-]
CREATE INDEX pgcontenido_idx
  ON planti_corr
  USING gin
  (to_tsvector('spanish'::regconfig, contenido));


2. Ahora que extraer el contenido de cada documento que se vaya a dar de alta, esto lo hice en el botón de "Altas" en el formulario de registro de documentos:
  • Crear una instancia del Portapapeles de Windows
  • Crear una instancia de Word y abrir el documento
  • Seleccionar todo el contenido del documento de Word y copiarlo en el Portapapeles de Windows
  • Cerrar Word
  • Poner el contenido del Portapapeles en una variable
    • El límite de tsvector en Postgresql es de 1048575 bytes por lo que limito el tamaño del contenido de la variable a 1040000 con la función LeftBStr()
  • Envío todo a Postgres en un Query
Código Delphi [-]
var
  word : Variant;
  plantiOrig : TClipBoard;
  wnContenido : WideString;
  wnGuarda : oleVariant;

begin
  ...
  ...
  Word := CreateOleObject('Word.Application');
  Word.Visible := False;
  
  try
     Word.Documents.Open(, EmptyParam, EmptyParam, EmptyParam,
                                      EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                                      EmptyParam, EmptyParam);

     Word.Selection.WholeStory;    // Seleccionar todo el contenido del documento de Word
     Word.Selection.Copy;            //  Copiar al portapapeles
     Word.ActiveDocument.Close(wnGuarda, EmptyParam, EmptyParam);
     Word.Quit;

     wnContenido := LeftBStr(plantiOrig.AsText, 1040000);    // Extrae únicamente 1040000 bytes
     plantiOrig.Clear;

     Query1.Active := False;
     Query1.SQL.Clear;
     Query1.SQL.Add('insert into planti_corr (nombre, archivo, contenido) values (:vNombre, :vArchivo, :vContenido)');
     
     Query1.ParamByName('vNombre').AsString := ;
     Query1.ParamByName('vArchivo').AsString := 
     Query1.ParamByName('vContenido').AsWideString := wnContenido;
     Query1.ExecSQL;
  Except
     Application.MessageBox('Error al cargar el archivo en la base de datos', 'Buscador', MB_OK or MB_ICONERROR);
  End;
  ...
  ...
end;

3. Ahora la búsqueda. En otro botón:
  • Tomo el texto con las palabras que desean buscar, éstas deben quedar separadas únicamente por el símbolo '&' (primerapalabra&segundapalabra&tercerapalabra); (no espacios, no comas, no puntos, no... nada) y asigno la nueva cadena a una variable, para esto utilizo la función ReplaceStr()
  • Ejecuto la consulta esta debe ser con la función "tsquery" de Postgres en el campo indexado, (que el servidor haga todo!!!)
  • ... y hago muy feliz a mi usuario !!!
Código Delphi [-]
var
  w_palabras : String;
  wpTotalReg : Integer;



begin
  ...
  ...


  w_palabras := ReplaceStr(edtFrases.Text,' ', '&');


  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('SELECT id_planti, nombre, archivo FROM planti_corr WHERE contenido @@ to_tsquery(:wqPalabras)');
  Query1.ParamByName('wqPalabras').AsString := w_Palabras;
  Query1.Open;

  wpTotalReg := Query1.RecordCount;
  ...
  ...
end;


Estas son las instrucciones básicas, obviamente hay cosas antes y después, pero concretando esta es la forma en que lo solucioné y efectivamente el tiempo de la búsqueda se redujo de algunos minutos a pocos segundos, bastante bien diría yo!!!.


Muchas gracias a todos, especialmente a mamcx y a D-MO por sus ideas (prácticamente la solución)


Saludos.


Eduardo Laguna
__________________
No lo intentes!. Hazlo o no lo hagas, pero no lo intentes !!! (Yoda)
Responder Con Cita
  #7  
Antiguo 19-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Muchas felicidades y muchas gracias por la solución

Este hilo me parece que puede ser de ayuda para mucha gente.

// Saludos
Responder Con Cita
  #8  
Antiguo 19-09-2012
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Cita:
Empezado por elaguna Ver Mensaje
...especialmente a mamcx y a D-MO por sus ideas (prácticamente la solución)...
Pues no, no tienes nada que agradecer

A ti te agradecemos que hayas compartido la solución.

Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
adjuntar documentos de word pabloloustau Conexión con bases de datos 5 04-04-2010 01:13:04
Documentos de word zidfrid C++ Builder 2 05-09-2008 02:17:11
Formatear documentos Word abril0404 Servers 1 27-02-2008 14:23:25
documentos .dot(word) en delphi CARSOFT_AR Varios 2 11-02-2005 17:39:25
documentos word Albano Varios 0 12-01-2005 02:19:38


La franja horaria es GMT +2. Ahora son las 12:04:46.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi