2009-03-27 9 views
1

Aller développer un moteur de recherche. Je me demande à quoi mon DDD devrait ressembler. Les enregistrements de tri doivent être implémentés, mais je ne veux pas que mes vues soient au courant de ma structure de base de données (par quelles colonnes trier). Autant que je comprends - l'information de tri devrait venir de la couche d'infrastructure, de l'implémentation de dépôt, donc il doit y avoir un domaine flexible.Moteur de recherche, asp.net mvc, Domain Driven Design

À quoi cela devrait-il ressembler?

Je veux que ce soit fortement typé.

Des meilleures pratiques?

Recommandations pour l'architecture?

Répondre

1

Si vous développez un moteur de recherche, vous serez forcé de penser à l'évolutivité très rapidement. Le tri dans les environnements liés à la recherche est un problème familier. Vous devriez jeter un coup d'œil aux implémentations de recherche de Google! Comment trier devrait dépendre d'un ranking algorithm. Une conception d'algorithme de classement centré sur un domaine ne devrait pas être si différente du classement qu'une approche de service!

Quelle langue vous utilisez est votre choix. Si vous choisissez C/C++ Message Passing Interface (MPI) pour l'informatique distribuée. Si vous utilisez Java, jetez un oeil à JMS et GridGain (GridGain implémente Googles MapReduce).

Une autre question est, comment stocker vos données (distribué, rapide, tolérant aux pannes)! Pour Java jeter un oeil à Project Voldemord (qui est l'un des meilleurs systèmes que vous pouvez obtenir gratuitement.

Pour plus d'informations sur l'architecture Google, en savoir plus sur the high scalability website.

Pour les questions au sujet de DDD, jetez un oeil à dddcommunity.org, la page d'accueil d'Eric Evans lui-même;) Il a écrit un très bon livre Domain-Driven Design. DDD est bien, car il assure l'intégrité et l'intégrité d'un domaine.

Un modèle simple pourrait être:

page (URL url, BigInt rank, List<String> keywords, 
     List<URL> links, List<URL> outLinks, Content ref) 


content (GzippedBytes[] content) 

Si un nouveau nœud est ajouté au système, il devrait réagir sur des choses comme « setLinks », etc. il peut l'obtenir est pagerank par son propre.

Le client est simple, il ne fait qu'une recherche (mots-clés) qui est triée par PageRank.

Voici un service example of a pagerank implementation en Java.

+0

Avec le moteur de recherche je ne voulais pas dire crawler/indexer. Il est supposé être un mécanisme de recherche ordinaire sur des objets métier spécifiés. –

+0

La méthode de recherche actuelle a cette signature: Get (string searchColonne, requête de chaîne, chaîne orderExpr, int startIndex, int maxRows, bool useRanks, int authorRank, int titleRank, int otherRank). –

+0

Je ne sais pas comment faire en sorte que la couche d'interface utilisateur ne sache rien de la structure de la base de données et puisse trier la page de résultats. :) –

0

Voici les bases d'un moteur de recherche personnalisé analysant les répertoires MVC View, lisant les fichiers et faisant correspondre le texte fourni avec une expression régulière. Mon site renvoie les liens html des résultats de recherche. Ce code entraînera la création d'une liste.

List<string> results = new List<string>(); 
DirectoryInfo di = new DirectoryInfo (System.Configuration.ConfigurationManager.AppSettings["PathToSearchableViews"]); 
//get all view directories except the shared 
foreach (DirectoryInfo d in di.GetDirectories().Where(d=>d.Name != "Shared")) 
{ 
    //get all the .cshtml files 
    foreach (FileInfo fi in d.GetFiles().Where(e=>e.Extension == ".cshtml")) 
    { 
    //check if cshtml file and exclude partial pages 
    if (fi.Name.Substring(0,1) != "_") 
    { 
     MatchCollection matches; 
     bool foundMatch = false; 
     int matchCount = 0; 
     using (StreamReader sr = new StreamReader(fi.FullName)) 
     { 
      string file = sr.ReadToEnd(); 
      foreach (string word in terms) 
      { 
       Regex exp = new Regex("(?i)" + word.Trim() + "(?-i)"); 
       matches = exp.Matches(file); 
       if (matches.Count > 0) 
       { 
        foundMatch = true; 
        matchCount = matches.Count; 
       } 
      } 
     //check match count and create links 
     // 
     // 
     } 
     } 
     } 
    } 
    return results;