2008-10-02 23 views
8

Este es el problema que tengo, tengo un conjunto de registros que pueden crecer con bastante rapidez. Se dividen en archivos individuales todos los días, y los archivos pueden crecer fácilmente en un concierto de tamaño. Para ayudar a mantener el tamaño reducido, las entradas de más de 30 días se borran.Búsqueda rápida de texto en los registros

El problema es cuando quiero buscar estos archivos para una cierta cadena. En este momento, una búsqueda de Boyer-Moore es irrealmente lenta. Sé que las aplicaciones como dtSearch pueden proporcionar una búsqueda realmente rápida mediante la indexación, pero no estoy seguro de cómo implementar eso sin ocupar el doble del espacio que un registro ya ocupa.

¿Hay algún recurso que pueda verificar que pueda ayudar? Realmente estoy buscando un algoritmo estándar que explique lo que debo hacer para construir un índice y usarlo para buscar.

Editar:
Grep no funcionará ya que esta búsqueda debe integrarse en una aplicación multiplataforma. No hay forma de que pueda cambiar, incluyendo cualquier programa externo.

La forma en que funciona es que hay una interfaz web que tiene un navegador de registro. Esto habla con un backend de servidor web C++ personalizado. Este servidor necesita buscar los registros en un tiempo razonable. Actualmente, la búsqueda a través de varios conciertos de registros demora años.

Editar 2: Algunas de estas sugerencias son geniales, pero tengo que reiterar que no puedo integrar otra aplicación, es parte del contrato. Pero para responder algunas preguntas, los datos en los registros varían entre mensajes recibidos en un formato específico de atención médica o mensajes relacionados con estos. Estoy buscando confiar en un índice porque aunque puede llevar hasta un minuto reconstruir el índice, actualmente la búsqueda lleva mucho tiempo (lo he visto demorar hasta 2.5 minutos). Además, muchos datos se descartan incluso antes de grabarlos. A menos que algunas opciones de registro de depuración estén activadas, más de la mitad de los mensajes de registro se ignoran.

La búsqueda básicamente es la siguiente: un usuario en el formulario web presenta una lista de los mensajes más recientes (transmitidos desde el disco mientras se desplazan, yay para ajax), generalmente, querrán buscar mensajes con algo de información, tal vez una identificación del paciente, o alguna cadena que hayan enviado, para que puedan ingresar la cadena en la búsqueda. La búsqueda se envía de forma asíncrona y el servidor web personalizado busca linealmente a través de los registros 1 MB a la vez para obtener algunos resultados. Este proceso puede llevar mucho tiempo cuando los registros crecen. Y es lo que estoy tratando de optimizar.

+0

pruébelo con grep como una herramienta externa, si es lo suficientemente rápido puede tomar el código fuente de gnu grep e integrarlo directamente en su aplicación. – gbjbaanb

+0

Me gustaría, pero es un problema legal si lo incluyo, he preguntado sobre seguir ese camino. – ReaperUnreal

Respuesta

2

Mira los algoritmos que Lucene usa para hacer su trabajo. Sin embargo, no es probable que sean muy simples. Tuve que estudiar algunos de estos algoritmos de vez en cuando, y algunos de ellos son muy sofisticados.

Si puede identificar las "palabras" en el texto que desea indexar, solo cree una gran tabla hash de las palabras que asigna un hash de la palabra a sus ocurrencias en cada archivo. Si los usuarios repiten la misma búsqueda con frecuencia, guardan en caché los resultados de la búsqueda. Cuando se realiza una búsqueda, puede verificar cada ubicación para confirmar que el término de búsqueda aparece allí, en lugar de solo una palabra con un hash coincidente.

Además, ¿a quién realmente le importa si el índice es más grande que los propios archivos? Si tu sistema es realmente tan grande, con tanta actividad, ¿hay algunas docenas de conciertos para un índice del fin del mundo?

5

grep generalmente funciona bastante bien para mí con grandes registros (a veces 12G +). Puede encontrar una versión para Windows here también.

+0

Derecha. Esa es mi primera idea también, pero el OP realmente necesita proporcionar un poco más de contexto para evaluar cuán útil puede ser esta sugerencia. – dmckee

0

Más detalles sobre el tipo de búsqueda que estás realizando definitivamente podrían ayudar. ¿Por qué, en particular, desea confiar en un índice, ya que tendrá que reconstruirlo todos los días cuando los registros vuelcan? ¿Qué tipo de información se encuentra en estos registros? ¿Puede descartarse algo antes de que se registre?

¿Cuánto tardan estas búsquedas ahora?

-2

Splunk es ideal para buscar a través de un montón de troncos.Puede ser excesivo para su propósito. Usted paga según la cantidad de datos (tamaño de los registros) que desea procesar. Estoy bastante seguro de que tienen una API para que no tengas que usar su front-end si no quieres.

0

Es posible que desee verificar la fuente de BSD grep. Es posible que no pueda confiar en que grep estará a su lado, pero nada dice que no pueda volver a crear una funcionalidad similar, ¿verdad?

Cuestiones relacionadas