2010-05-29 28 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