Je souhaite rechercher une phrase (combinaison de mots) dans une table ou une vue de la base de données. Je ne veux pas utiliser la propriété de recherche Fultext de DB. Y a-t-il une alternative efficace?Comment faire une recherche efficace de données dans la base de données à l'exception de fullsearch
Comment faire une recherche efficace de données dans la base de données à l'exception de fullsearch
Répondre
Sans l'utilisation d'un index, une base de données doit effectuer une "analyse de table complète". C'est un peu comme si vous parcouriez un livre une page à la fois pour trouver ce dont vous avez besoin.
Cela étant dit, les ordinateurs sont beaucoup plus rapides que les humains. Cela dépend vraiment de la charge de votre système. Grâce à MySQL, nous avons implémenté avec succès un système de recherche sur une table d'informations. La nature du problème était celle qui ne pouvait pas être résolue par les index normaux (y compris le texte intégral). Nous avons donc conçu pour être alimenté en utilisant un balayage de table complet. Cela impliquait de créer des tables aussi étroites que possible avec les données de recherche, et de les joindre à une table plus grande avec des données connexes, mais sans recherche.
À l'époque (il y a 4 ans), 100 000 enregistrements pouvaient être analysés en 0,06 secondes. 1 000 000 d'enregistrements ont pris environ 0,6 seconde. Le système est toujours utilisé en production intensive avec des millions d'enregistrements.
Si vos données doivent dépasser 6 chiffres, vous pouvez réévaluer en utilisant un index de texte intégral ou faire des recherches sur les index inversés.
S'il vous plaît commenter si vous souhaitez plus d'informations.
Edit: Les tables de recherche ont été maintenus aussi étroite que possible. Idéalement 50-100 octets par enregistrement. ENUMS et TINYINT sont d'excellents économiseurs d'espace si vous pouvez les utiliser pour "mapper" les valeurs de chaîne d'une autre manière.
Les requêtes de recherche ont été générées en utilisant une classe PHP. Ils étaient tout simplement:
-- DataTable is the big table that holds all of the data
-- SearchTable is the narrow table that holds the bits of searchable data
SELECT
MainTable.ID,
MainTable.Name,
MainTable.Whatever
FROM
MainTable, SearchTable
WHERE
MainTable.ID = SearchTable.ID
AND SearchTable.State IN ('PA', 'DE')
AND SearchTable.Age < 40
AND SearchTable.Status = 3
Essentiellement, les deux tables ont été rejoints sur une clé primaire (rapide) et le filtrage a été fait par analyse complète de table sur la SearchTable (assez rapide). Nous utilisions MySQL.
Nous avons constaté qu'en ayant le format d'enregistrement == "FIXED" dans les tables MyISAM, nous pouvions augmenter la performance de 3x. Cela signifie pas de blobs, pas de varchars, etc ...
Faites-moi savoir si cela aide.
Aucun n'est aussi efficace que la recherche de texte intégral.
Fondamentalement, il se résume à où avec comme dérivés et puisque les indices sont jetés loin dans la plupart des scénarios, il devient une question très cher.
Si vous utilisez JAVA ont à regarder Lucene
Si vous utilisez .net, vous pouvez jeter un oeil à Lucene.net, il réduira au minimum les appels à la base de données pour les requêtes de recherche.
Après de http://incubator.apache.org/lucene.net/
Lucene.Net est un code source, classe par classe, API-per-API et le port algorithmatic du moteur de recherche Lucene Java à C# et .NET plate-forme utilisant Microsoft .NET Framework. Lucene.Net adhère aux API et classes utilisées dans l'implémentation Java d'origine de Lucene. Les noms d'API ainsi que les noms de classe sont conservés avec l'intention de donner à Lucene.Net l'aspect et la convivialité du langage C# et du .NET Framework. Pour l'exemple , la méthode Hits.length() dans l'implémentation Java lit maintenant Hits.Length() dans le port C#.
En plus des API et des classes port à C#, l'algorithme de Java Lucene est porté sur C# Lucene. Ce signifie un index créé avec Java Lucene est compatible avec les va-et-vient avec le C# Lucene; les deux à la lecture, écriture et mise à jour. En fait, un index Lucene peut être recherché simultanément et mis à jour en utilisant Java Lucene et C# Processus Lucene.
Vous ne devez pas être limité à la machine virtuelle Java pour tirer parti de Lucene - vous pouvez utiliser Solr qui est une enveloppe HTTP autour Lucene. J'ai eu un énorme succès avec Solr: http://lucene.apache.org/solr/ –
C'est génial, je ne sais pas à propos de ça, merci cody! – renegadeMind
Vous pouvez diviser le texte en mots individuels, les coller dans une table distincte et l'utiliser pour trouver les ID PK qui contiennent tous les mots de votre phrase de recherche [c.-à-d. mais pas nécessairement dans le bon ordre], puis recherchez seulement ces lignes pour la phrase. Devrait éviter d'avoir à faire un scan de table à chaque fois.
S'il vous plaît demander si vous avez besoin de moi d'expliquer davantage
- 1. Comment faire une recherche de chaîne floue sans une base de données lourde?
- 2. Comment faire une recherche avec plusieurs critères à partir d'une base de données avec SQL?
- 3. Comment faire des tâches de gestion de données dans une base de données d'objets Db4o?
- 4. Base de données externe de recherche SharePoint
- 5. Meilleur moyen efficace de faire une recherche fulltext dans MySQL
- 6. Question efficace sur la base de données mySQL
- 7. Comment charger des données statiques dans Mirth, éviter de nombreux roundtrips à une base de données
- 8. données dans une table emboîtées de base de données
- 9. Comment lier des données dans une base de données à mes classes de données?
- 10. Comment faire pour restaurer la base de données mysql
- 11. Comment stocker des données modifiées dans une base de données?
- 12. Question de conception de base de données: Comment gérer une énorme quantité de données dans Oracle?
- 13. Recherche base de données en utilisant une collection d'objets entité
- 14. Comment faire une sauvegarde d'une base de données PLSQL?
- 15. faire acondition sur la table de base de données sql
- 16. Connectez J2ME à la base de données
- 17. Normalisation automatisée de la base de données mySQL - comment le faire?
- 18. Meilleure approche pour le transfert de données de la base de données distante à la base de données locale
- 19. Comment sauvegarder une base de données à partir de ServerGrid.com?
- 20. comment extraire des données de la base de données?
- 21. Recherche de la colonne de base de données à laquelle est mappée la propriété d'une entité
- 22. Comment obtenir des données d'une base de données vers une autre base de données?
- 23. Comment synchroniser la base de données d'applications Web avec une base de données d'application Windows
- 24. Comment archiver une base de données MySQL?
- 25. Comment accéder à une base de données SQLite dans Clojure?
- 26. Comment rechercher une chaîne dans toute la base de données?
- 27. Conception de base de données: Stocker des données à partir de formulaires papier dans la base de données
- 28. Déplacement de données à partir d'une grille dans une base de données
- 29. Dans la base de données de mémoire
- 30. Comment une recherche dans une base de données est-elle réalisée?
Oui s'il vous plaît expliquer un peu plus pour moi. Ce n'était pas clair sur les tableaux étroits ou comment vous avez implémenté la recherche. – Robert