【问题标题】:How to build a search engine in C# [closed]如何在 C# 中构建搜索引擎 [关闭]
【发布时间】:2011-02-25 09:11:14
【问题描述】:

我正在尝试在 ASP.NET MVC 中构建一个 Web 应用程序,并且需要构建一个非常复杂的搜索功能。当用户输入搜索词时,我想搜索各种数据源,包括文档、数据库中的表格、网页 url 和一些 API,如 facebook。任何提示、教程和提示将不胜感激。

【问题讨论】:

  • 你卡在哪里了?您被索引存储或搜索或查询分析所困扰?搜索引擎是一个相当大的话题
  • 其中哪一部分有困难?如果您在构建复杂的搜索引擎时遇到问题,我会先从简单 开始。构建仅搜索文档的内容,因为您最终将需要该部分。然后继续进行数据库搜索。
  • 指向谷歌。瞧,即时搜索。
  • 使用第三方,您实际上可以从 Google 购买服务器或在您的机器上安装 Lucen(或类似的)并将其用作搜索引擎。我用谷歌做了这个,非常简单,非常高效,非常昂贵;-)

标签: c# asp.net-mvc search


【解决方案1】:

我为我的 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;

【讨论】:

  • 从数据库中读取部分数据好像不行吧?
【解决方案2】:

构建实际的搜索索引结构和算法并非易事。这就是人们使用 Lucene、Sphinx、Solr 等的原因。使用 google.com,如 cmets 中所推荐的那样,与您从这些免费搜索引擎之一获得的内容相比,在正确配置和用过。

我建议看一下Solr,它为您提供了 Lucene 的强大功能,但它更易于使用,此外它还添加了一些便利功能,如缓存、分片、分面等。

SolrNet 是 .Net 的 Solr 客户端,它有一个示例 ASP.NET MVC 应用程序,您可以使用它来了解它的工作原理并作为项目的基础。

免责声明:我是 SolrNet 的作者。

【讨论】:

  • 它还在积极开发中吗? github 看起来很活跃
【解决方案3】:

您的问题表明您可能不打算从头开始实现整个功能,因此这里有一些您可能会觉得有用的链接。

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

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

【讨论】:

  • lucene.net 看起来已经死了,还有其他选择吗?
  • @augustas 我可能是错的,但似乎有一些活动git-wip-us.apache.org/repos/asf?p=lucenenet.gitgit-wip-us.apache.org/repos/… 48 小时)对于来自 apache 的人来说,这是一个断断续续的“业余时间”项目(偶尔其他大公司)谁在它工作。 3.0.3 已死 AFAIK。 4.8 是两年前的测试版。不知道那里发生了什么code972.com/blog/2016/07/… - 也许半死不活?就像好莱坞现在拥有的那些真正快速的僵尸之一。
猜你喜欢
  • 2011-09-12
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多