2013-08-14 8 views
0

Je construis une base de données assez grande où j'aurai beaucoup de tables avec diverses données.Bulding moteur de recherche pour grande base de données

Mais chaque table possède des champs similaires, par exemple un titre vidéo ou un titre de plage. Maintenant, le problème que je suis confronté est de savoir comment créer une requête qui chercherait une correspondance de mots clés sur cinq tables ou plus, gardez à l'esprit que chaque table peut potentiellement avoir de 100k à 1million de lignes ou dans certains cas, même en couple millions de lignes. Je pense que l'utilisation de jointures ou de requêtes séparées pour chaque table serait très lente, alors j'ai pensé à créer une table séparée où stocker les données de recherche.

Par exemple, je pense qu'il pourrait avoir des domaines comme ceux-ci,

id ---- username ---- title ---- body ---- date ---- belongs_to ---- post_id

De cette façon, je pense qu'il serait beaucoup plus rapide effectuer des recherches, ou suis-je tout à fait tort? Le seul problème avec cette approche que je peux penser est qu'il serait difficile de gérer cette table parce que si l'enregistrement original de certaines des tables est supprimé, je devrais aussi supprimer l'enregistrement de la table 'search' comme bien.

+0

ça va être moche, et difficile à maintenir. Si vous suivez cette route, une requête distincte sur chaque table serait le chemin à parcourir. Si ces requêtes retournent les mêmes colonnes (ou vous pouvez le faire en introduisant des espaces réservés littéraux dans certaines des requêtes, de sorte que les colonnes de retour soient toutes "alignées", ces requêtes séparées peuvent être combinées en utilisant les ' UNION ALL' opérateur.Il existe de meilleures alternatives à MySQL pour faire des "recherches rapides par mot clé". – spencer7593

+0

"Si vous optez pour cette route, une requête distincte sur chaque table serait le chemin à suivre Si ces requêtes retournent les mêmes colonnes (ou vous pouvez le faire en introduisant des espaces réservés littéraux dans certaines des requêtes, donc que les colonnes de retour soient toutes "alignées", alors ces requêtes séparées pourraient être combinées en utilisant l'opérateur UNION ALL "qui sera difficile à maintenir .. il gâchera les performances de MySQL si vous indexez correctement la base de données ne devrait pas avoir de problème avec cette données et vous devriez avoir une bonne normalisation de la table –

Répondre

0

Ne pas utiliser MySQL pour se joindre à un bon nombre de tables, je vous suggère de jeter un oeil à Apache Solr, avec RDBMS

0

Jetez un oeil à certains systèmes de recherche d'information. Ils ont également besoin de leurs propres index, vous devez donc indexer les données après chaque mise à jour (ou à intervalles réguliers) pour maintenir l'index de recherche à jour. Mais ils offrent les avantages suivants:

  • beaucoup plus rapide, car ils utilisent des algorithmes spéciaux et des structures de données conçues pour spécifiquement cette fin
  • possibilité de rechercher des documents basés sur un ensemble de termes (et peut-être aussi un ensemble de termes négatifs qui ne doivent pas apparaître dans le résultat)
  • recherche automatique de phrases (par ex. "ing" ...)
  • détection d'erreurs d'orthographe (c'est à dire. « Vouliez-vous dire ...? »)
  • pour éviter l'indexation des mots vides vraiment mots vides de sens commun (« a », « la », etc.)
  • requêtes génériques
  • avancé des stratégies de classement (c.-à-classement par pertinence, en fonction du nombre et la position de chaque occurrences des termes de recherche)

Je l'ai utilisé xapian dans le passé pour mes projets et j'étais très heureux avec elle. Lucene, Solr et elastic search sont quelques autres projets très populaires qui pourraient répondre à vos besoins.

Questions connexes