2010-05-29 12 views
7

Sto provando a creare un'applicazione Web in ASP.NET MVC e ho bisogno di creare una funzione di ricerca piuttosto complessa. Quando un utente inserisce un termine di ricerca, desidero cercare una varietà di fonti di dati che includono documenti, tabelle nel database, URL di pagine Web e alcune API come Facebook. Eventuali suggerimenti, tutorial e suggerimenti sarebbero molto apprezzati.Come creare un motore di ricerca in C#

+0

dove sei stucked? Sei stivato con la memorizzazione dell'indice o con la ricerca o con l'analisi delle query? Il motore di ricerca è un argomento piuttosto importante – vodkhang

+0

Con quale parte hai difficoltà? Se hai problemi nella creazione di un motore di ricerca complesso, inizierei prima con * simple *. Costruisci qualcosa che cerca solo i documenti, perché alla fine avrai bisogno di quella parte. Quindi passare alle ricerche nel database. –

+3

Punta google a questo. Voila, ricerca istantanea. – Randolpho

risposta

14

La tua domanda suggerisce che probabilmente non stai pianificando di implementare l'intera funzionalità da zero, quindi ecco alcuni link che potresti trovare utili.

  • One (il più facile) opzione sarebbe quella di utilizzare un motore di ricerca di terze parti (ad esempio Google Custom Search, ma Bing probabilmente ha un'API simile). Ciò ti consente di cercare (solo) la tua pagina utilizzando Google e visualizzare i risultati in modo personalizzato. La limitazione è che cerca solo i dati visualizzati su alcune pagine (collegate).

  • Un approccio più sofisticato consiste nell'utilizzare alcune librerie .NET che implementano l'indicizzazione per l'utente (in base ai dati forniti dall'utente). Una libreria popolare è ad esempio Lucene.Net. In questo caso, gli dai i dati che vuoi cercare esplicitamente (contenuto pertinente da pagine web, contenuto del database, ecc.), In modo da avere un maggiore controllo di ciò che viene cercato (ma è un po 'più di lavoro).

+0

lucene.net è morto per l'aspetto di esso, ci sono altre alternative? – Augustas

+0

@augustas Potrei sbagliarmi ma sembra esserci qualche attività https://git-wip-us.apache.org/repos/asf?p=lucenenet.git (48 ore in https: // git-wip- us.apache.org/repos/asf?p=lucenenet.git;a=commit;h=159c33ba2abbcfb9bf1882f672ba113ace9aa363) È un progetto "tempo libero" "on e off" per le persone di Apache (e occasionali altri grandi corp) che lavorano su esso. 3.0.3 è morto AFAIK. 4.8 era in beta due anni fa.non so cosa sia successo lì http://code972.com/blog/2016/07/98-lucene-net-4-8-is-in-beta-and-we-need-your-help - quindi mezzo morto forse? Come uno di quegli zombi davvero veloci che Hollywood ha ora. – twobob

4

Costruire le strutture e gli algoritmi dell'indice di ricerca attuali non è un'impresa da poco. Ecco perché le persone usano Lucene, Sphinx, Solr, ecc. L'uso di google.com, come raccomandato nei commenti, non ti darà alcun controllo e una corrispondenza inadeguata rispetto a quello che otterrai da uno di questi motori di ricerca gratuiti, se correttamente configurato e Usato.

Raccomando dare un'occhiata a Solr, ti dà il potere di Lucene, ma è molto più facile da usare, più esso aggiunge diverse caratteristiche di comfort, come il caching, sharding, sfaccettatura, ecc

SolrNet è un client Solr per .Net, ha un'app ASP.NET MVC di esempio che puoi usare per vedere come funziona e come base per il tuo progetto.

Disclaimer: Sono l'autore di SolrNet.

+0

È ancora in sviluppo attivo? Il github sembra attivo mentre – JochemQuery

2

Ho scritto un motore di ricerca personalizzato per il mio sito MVC 4. Analizza le directory View e legge tutti i file .cshtml, facendo corrispondere i termini forniti con un'espressione regolare. Ecco il codice di base:

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; 
+0

sembra non funzionare se alcuni dati sono letti da database dei moduli, giusto? –

Problemi correlati