2010-05-15 12 views
1

J'essaie de développer un moteur de recherche textuel complexe. J'ai des milliers de pages textuelles tirées de nombreux livres. Je dois rechercher des pages qui contiennent des critères logiques complexes spécifiés. Ces critères peuvent contenir pratiquement n'importe quelle combinaison de ce qui suit:SQL avec des expressions régulières vs des index avec des fonctions de fusion logiques

A: Mots complets. B: Racines de mots (semilaires à tiges, c'est-à-dire tous les mots avec certaines lettres clés). C: Modèles Word (dans certaines langues, les racines sont remplies dans certains modèles pour former différentes parties de la parole, telles que les adjacents, les verbes passés/présents ...). D: Connecteurs logiques: AND/OR/XOR/NOT/IF/IFF et parenthèses aux priorités d'état.

Maintenant, serait-il plus rapide d'avoir le texte intégral des pages dans la base de données (non indexé) et de les parcourir toutes en utilisant SQL et les expressions rationnelles?

Ou serait-il préférable de construire des index de tuples word/root/template-page-location. Par conséquent, nous pouvons stimuler la recherche de mots/racines/modèles individuels. Cependant, cela devient difficile car nous introduisons des connecteurs logiques dans nos requêtes. J'ai pensé à faire les étapes suivantes dans de tels cas:

1: Rechercher séparément chaque mot/racine/modèle dans la requête spécifiée.

2: Sur les bases prioritaires, nous fusionnons deux listes de résultats (de l'étape 1) à un moment depedning sur le conjonctifs logique

Par exemple, si nous recherchons « lui et (est ou était) »: 1: Nous allons chercher "he", "is" et "was" séparément et obtenir des listes de résultats pour chaque mot. 2: Fusionner les listes de résultats de "is" et "was" en utilisant la fonction de fusion OR-MERGE.

3: Fusionner la liste des résultats fusionnés de la fonction OR-MERGE avec celle de "he" en utilisant la fonction de fusion AND-MERGE.

Le résultat de l'étape 3 est ensuite renvoyé comme résultat de la requête spécifiée.

Que pensez-vous des gurues? Lequel est plus vite ? De meilleures idées?

Merci d'avance.

Répondre

1

Il existe de nombreuses solutions disponibles sur le marché pour ce type de problème. Je vous recommande fortement d'utiliser l'un d'entre eux au lieu de développer le vôtre.

Vous ne dites pas quelle solution de base de données vous utilisez. Si c'est Microsoft SQL Server, vous pouvez utiliser ses fonctionnalités Full Text Search. Si c'est MySQL, jetez un oeil à son Full-Text Search Functions. Je suis sûr qu'Oracle, DB2 et tout autre SGBD majeur auront des fonctionnalités similaires.

Sinon, jetez un oeil à Lucene for Java d'Apache ou Lucene for .NET. Cela vous permettra d'indexer des documents sans avoir besoin d'utiliser un SGBD.

+0

Merci de votre temps pour répondre à mes Q.J'ai trouvé qu'il était possible d'utiliser BerkeleyDB d'Oracle avec des fonctions de fusion de performance de recherche binaire. Ma décision était due à la complexité du soutien nécessaire pour la langue arabe qui n'est pas couvert par les DB de texte intégral autant que je pourrais faire de la recherche. – geeko