2010-05-29 109 views
7

Estoy tratando de crear una aplicación web en ASP.NET MVC y necesito crear una función de búsqueda bastante compleja. Cuando un usuario ingresa un término de búsqueda, quiero buscar en una variedad de fuentes de datos que incluyen documentos, tablas en la base de datos, URL de páginas web y algunas API como Facebook. Cualquier consejo, tutorial y consejos serían muy apreciados.Cómo construir un motor de búsqueda en C#

+0

¿dónde estás pegado? ¿Estás atrapado en el almacenamiento de índice o con la búsqueda, o con el análisis de consultas? El motor de búsqueda es un tema bastante importante – vodkhang

+0

¿Con qué parte estás teniendo problemas? Si tiene problemas para construir un motor de búsqueda complejo, comenzaría con un * simple * primero. Cree algo que solo busque documentos, porque eventualmente necesitará esa parte. Luego pase a las búsquedas en la base de datos. –

+3

Señale google en él. Voila, búsqueda instantánea. – Randolpho

Respuesta

14

Su pregunta sugiere que probablemente no esté planeando implementar toda la característica desde cero, por lo que aquí hay algunos enlaces que pueden serle útiles.

  • Uno (el más fácil)

    opción sería utilizar un motor de búsqueda de terceros (por ejemplo Google Custom Search, pero Bing probablemente tiene una API similar). Esto le permite buscar (solo) su página usando Google y mostrar los resultados de manera personalizada. La limitación es que solo busca los datos que se muestran en algunas páginas (vinculadas).

  • Un enfoque más sofisticado es utilizar alguna biblioteca .NET que implemente indexación para usted (en función de los datos que le proporcione). Una biblioteca popular es, por ejemplo, Lucene.Net. En este caso, le proporciona los datos que desea buscar explícitamente (contenido relevante de páginas web, contenido de la base de datos, etc.), para que tenga más control de lo que se está buscando (pero es un poco más de trabajo).

+0

lucene.net está muerto por lo que parece, ¿hay otras alternativas? – Augustas

+0

@augustas Podría estar equivocado, pero parece haber alguna actividad https://git-wip-us.apache.org/repos/asf?p=lucenenet.git (48 horas en https: // git-wip- us.apache.org/repos/asf?p=lucenenet.git;a=commit;h=159c33ba2abbcfb9bf1882f672ba113ace9aa363) Es un proyecto intermitente de "tiempo libre" para las personas de apache (y ocasionalmente otras grandes corporaciones) que trabajan en eso. 3.0.3 está muerto AFAIK. 4.8 estaba en versión beta hace dos años.no sé qué pasó allí http://code972.com/blog/2016/07/98-lucene-net-4-8-is-in-beta-and-we-need-your-help - ¿tal vez medio muerto? Como uno de esos zombis realmente rápidos que Hollywood tiene ahora. – twobob

4

Crear las estructuras y los algoritmos del índice de búsqueda real no es una hazaña trivial. Es por eso que las personas usan Lucene, Sphinx, Solr, etc. El uso de google.com, como se recomienda en los comentarios, no le dará control y una comparación deficiente en comparación con lo que obtendrá de uno de estos motores de búsqueda gratuitos, cuando esté configurado correctamente y usado.

Lo recomiendo echar un vistazo a Solr, que le da el poder de Lucene, pero es mucho más fácil de usar, además de que añade varias características de conveniencia como el almacenamiento en caché, sharding, facetado, etc.

SolrNet es un cliente Solr para .Net, tiene una aplicación ASP.NET MVC de muestra que puede usar para ver cómo funciona y como base para su proyecto.

Descargo de responsabilidad: soy el autor de SolrNet.

+0

¿Todavía está en desarrollo activo? El github parece activo aunque – JochemQuery

2

Escribí un motor de búsqueda personalizado para mi sitio MVC 4. Analiza los directorios Ver y lee todos los archivos .cshtml, que coinciden con los términos proporcionados con una expresión regular. Aquí está el código básico:

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

parece que no está funcionando si algunos datos se leen desde la base de datos, ¿verdad? –

Cuestiones relacionadas