如何在C#中构建搜索引擎

15

我正在尝试使用ASP.NET MVC构建一个web应用程序,并需要构建一个相当复杂的搜索功能。当用户输入搜索词时,我希望能够搜索多种数据源,包括文档、数据库中的表格、网页URL以及一些API,比如Facebook。有什么提示、教程或提示将不胜感激。


1
你卡在哪里了?是在索引存储、搜索还是查询分析方面?搜索引擎是一个相当大的主题。 - vodkhang
你在这部分有什么困难吗?如果你在构建复杂的搜索引擎方面遇到麻烦,我建议先从一个简单的搜索引擎开始。先构建一个只搜索文档的东西,因为你最终会需要那部分。然后再转向数据库搜索。 - Greg Hewgill
3
将Google对准它,瞧,瞬间搜索。 - Randolpho
您可以通过第三方服务,例如从谷歌购买服务器或在自己的计算机上安装Lucen(或类似软件)作为搜索引擎。我曾尝试过使用谷歌来实现这一点,非常简单,高效,但也相当昂贵。 - Itay Moav -Malimovka
3个回答

17

从你的问题中可以看出,你可能不打算从头开始实现整个功能,因此以下是一些你可能会发现有用的链接。

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

  • 更复杂的方法是使用一些.NET库为您实现索引(基于您提供给它的数据)。一个流行的库是例如Lucene.Net。在这种情况下,您显式地提供要搜索的数据(来自网页的相关内容、数据库内容等),因此您可以更好地控制正在搜索什么(但需要更多的工作)。


Lucene.net看起来已经死了,有其他的替代品吗? - Augustas
@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已经死了。4.8在两年前就处于beta版。不知道那里发生了什么 http://code972.com/blog/2016/07/98-lucene-net-4-8-is-in-beta-and-we-need-your-help - 因此可能半死不活?就像好莱坞现在拥有的那些非常快的僵尸之一。 - twobob

8
建立实际的搜索索引结构和算法并非易事。这就是为什么人们使用Lucene、Sphinx、Solr等工具的原因。使用评论中推荐的google.com将无法控制且匹配效果较差,相比之下,当正确配置和使用时,这些免费的搜索引擎可以提供更好的匹配效果。
我建议看一下Solr,它提供了Lucene的功能,但使用起来更加容易,并添加了几个方便的特性,如缓存、分片、faceting等。 SolrNet是一个针对.Net的Solr客户端,它有一个示例ASP.NET MVC应用程序,您可以使用它来了解它的工作原理,并作为您项目的基础。
免责声明:我是SolrNet的作者。

它仍在积极开发中吗?GitHub看起来还是很活跃的。 - JochemQuery

3

我为我的MVC 4网站编写了一个自定义搜索引擎。它解析视图目录并读取所有.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;

如果从数据库中读取了一些数据,似乎它不起作用了,对吗? - P.K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接