2008-10-02 10 views
8

Voici le problème que j'ai, j'ai un ensemble de journaux qui peuvent se développer assez rapidement. Ils sont divisés en fichiers individuels chaque jour, et les fichiers peuvent facilement atteindre une taille de concert. Pour réduire la taille, les entrées de plus de 30 jours sont supprimées.Recherche de texte rapide sur les journaux

Le problème est lorsque je veux rechercher ces fichiers pour une certaine chaîne. En ce moment, une recherche Boyer-Moore est irrémédiablement lente. Je sais que des applications comme dtSearch peuvent fournir une recherche très rapide en utilisant l'indexation, mais je ne suis pas vraiment sûr de savoir comment l'implémenter sans prendre deux fois plus d'espace qu'un log.

Y a-t-il des ressources que je peux consulter pour vous aider? Je suis vraiment à la recherche d'un algorithme standard qui expliquera ce que je devrais faire pour construire un index et l'utiliser pour chercher.

Edit:
Grep ne fonctionnera pas comme cette recherche doit être intégrée dans une application multi-plateforme. Il n'y a aucun moyen que je sois capable de balancer y compris n'importe quel programme externe dedans. La façon dont cela fonctionne est qu'il y a une interface Web qui a un navigateur de journal. Cela parle à un backend de serveur Web C++ personnalisé. Ce serveur doit rechercher les journaux dans un délai raisonnable. Actuellement, la recherche à travers plusieurs concerts de journaux prend des âges.

Éditer 2: Certaines de ces suggestions sont excellentes, mais je dois réitérer que je ne peux pas intégrer une autre application, cela fait partie du contrat. Mais pour répondre à certaines questions, les données contenues dans les journaux diffèrent à partir des messages reçus dans un format spécifique à la santé ou des messages les concernant. Je cherche à me fier à un index car, même si cela peut prendre jusqu'à une minute pour reconstruire l'index, la recherche prend actuellement beaucoup de temps (je l'ai vu prendre jusqu'à 2,5 minutes). En outre, beaucoup de données sont rejetées avant même d'être enregistrées. À moins que certaines options de journalisation du débogage soient activées, plus de la moitié des messages du journal sont ignorés. La recherche se résume à ceci: Un utilisateur sur le formulaire Web est présenté avec une liste des messages les plus récents (diffusés à partir du disque pendant qu'ils défilent, yay pour ajax), généralement, ils veulent rechercher des messages avec quelques informations, un identifiant de patient ou une chaîne qu'ils ont envoyée, afin qu'ils puissent entrer la chaîne dans la recherche. La recherche est envoyée de manière asynchrone et le serveur Web personnalisé recherche linéairement dans les journaux 1 Mo à la fois pour obtenir des résultats. Ce processus peut prendre beaucoup de temps lorsque les journaux deviennent gros. Et c'est ce que j'essaie d'optimiser.

+0

Essayez-le avec grep comme un outil externe, si c'est assez rapide, vous pouvez prendre le code source gnu grep et l'intégrer directement dans votre application. – gbjbaanb

+0

Je voudrais, mais c'est un problème juridique si je l'inclue, j'ai demandé à ce sujet. – ReaperUnreal

Répondre

2

Découvrez les algorithmes que Lucene utilise pour faire les choses. Cependant, ils ne sont pas susceptibles d'être très simples. J'ai dû étudier certains de ces algorithmes une fois, et certains d'entre eux sont très sophistiqués.

Si vous pouvez identifier les "mots" dans le texte que vous souhaitez indexer, créez simplement une grande table de hachage des mots qui mappe un hachage du mot à ses occurrences dans chaque fichier. Si les utilisateurs effectuent la même recherche fréquemment, mettez en cache les résultats de la recherche. Quand une recherche est faite, vous pouvez vérifier chaque emplacement pour confirmer que le terme de recherche tombe là, plutôt que juste un mot avec un hachage correspondant.

En outre, qui se soucie vraiment si l'index est plus grand que les fichiers eux-mêmes? Si votre système est vraiment aussi gros, avec tant d'activité, quelques douzaines de concerts pour un indice à la fin du monde?

5

grep fonctionne généralement très bien pour moi avec de grosses bûches (parfois 12G +). Vous pouvez également trouver une version pour Windows here.

+0

Droit. C'est aussi ma première réflexion, mais le PO doit vraiment fournir un peu plus de contexte pour évaluer l'utilité de cette suggestion. – dmckee

0

Plus de détails sur le type de recherche que vous effectuez pourraient certainement aider. Pourquoi, en particulier, voulez-vous vous fier à un index, puisque vous devrez le reconstruire tous les jours lorsque les journaux se renverseront? Quel genre d'information est dans ces journaux? Peut-on en jeter une partie avant même qu'elle ne soit enregistrée?

Combien de temps durent ces recherches maintenant?

-2

Splunk est idéal pour la recherche dans beaucoup de journaux.Peut être exagéré pour votre but. Vous payez en fonction de la quantité de données (taille des journaux) que vous souhaitez traiter. Je suis sûr qu'ils ont une API, donc vous n'avez pas besoin d'utiliser leur interface si vous ne le souhaitez pas.

0

Vous pouvez voir la source de BSD grep. Vous ne pouvez pas être en mesure de compter sur grep être là pour vous, mais rien ne dit que vous ne pouvez pas recréer des fonctionnalités similaires, non?

Questions connexes