2010-05-29 27 views
7

我想在ASP.NET MVC中构建一个Web应用程序,并且需要构建一个非常复杂的搜索功能。当用户输入搜索词时,我想搜索各种数据源,其中包括文档,数据库中的表格,网页URL以及一些API(如Facebook)。任何提示,教程和提示将不胜感激。如何在C#中构建搜索引擎

+0

你在哪里被卡住了?你被索引存储,搜索或查询分析困住了吗?搜索引擎是一个相当大的话题 – vodkhang 2010-05-29 02:07:10

+0

你有什么困难?如果您在构建复杂的搜索引擎时遇到问题,我会先从一个简单的*开始。构建仅搜索文档的内容,因为您最终需要这部分内容。然后继续进行数据库搜索。 – 2010-05-29 02:07:48

+3

指向谷歌。瞧,即时搜索。 – Randolpho 2010-05-29 02:11:17

回答

14

你的问题表明你可能不打算从零开始实现整个功能,所以这里有一些你可能会觉得有用的链接。

  • 一个(最简单的)选项是使用第三方搜索引擎(例如Google Custom Search,但兵大概也有类似的API)。这允许您使用Google搜索(仅)您的页面,并以自定义的方式显示结果。限制在于它只搜索某些(链接)页面上显示的数据。

  • 更复杂的方法是使用一些为您实现索引的.NET库(基于您提供的数据)。一个流行的图书馆是例如Lucene.Net。在这种情况下,您可以明确指定要搜索的数据(网页中的相关内容,数据库内容等),以便更好地控制正在搜索的内容(但这有点多)。

+0

lucene.net已经死了,它有其他的选择吗? – Augustas 2017-05-02 06:40:20

+0

@augustas我可能是错的,但似乎有一些活动 https://git-wip-us.apache.org/repos/asf?p=lucenenet.git(48小时在https:// git-wip- us.apache.org/repos/asf?p=lucenenet.git;a=commit;h=159c33ba2abbcfb9bf1882f672ba113ace9aa363) 这是一个开启和关闭“闲暇时间”项目的人从apache(和偶尔其他大公司)谁工作它。 3.0.3已经死了AFAIK。 4.8是在两年前的测试版。不知道那里发生了什么 http://code972.com/blog/2016/07/98-lucene-net-4-8-is-in-beta-and-we-need-your-help - 那么半死吧?就像好莱坞现在那些真正快速的僵尸之一一样。 – twobob 2017-05-03 01:47:55

4

构建实际的搜索索引结构和算法不是小事。这就是为什么人们使用Lucene,狮身人面像,Solr等。使用google.com,正如评论中所建议的那样,如果配置合适,并且在使用这些免费搜索引擎时,将无法控制和较差的匹配用过的。

我建议考虑看看Solr,它给你的Lucene的权力,但它更容易使用,再加上它增加了一些方便的功能,如高速缓存,分片,刻面等

SolrNet是Solr的客户端对于.Net,它有一个示例ASP.NET MVC应用程序,您可以使用它来查看它是如何工作的以及作为项目的基础。

声明:我是SolrNet的作者。

+0

它还在积极发展中吗?该github看起来活跃tho – JochemQuery 2017-09-04 08:27:44

2

我为我的MVC 4网站编写了一个自定义搜索引擎。它解析View目录并读取所有的.cshtml文件,并使用正则表达式匹配提供的条款。这里是基本代码:

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

它似乎不工作,如果一些数据从数据库中读取,对不对? – 2016-11-17 08:06:25