我正在尝试使用ASP.NET MVC构建一个web应用程序,并需要构建一个相当复杂的搜索功能。当用户输入搜索词时,我希望能够搜索多种数据源,包括文档、数据库中的表格、网页URL以及一些API,比如Facebook。有什么提示、教程或提示将不胜感激。
我正在尝试使用ASP.NET MVC构建一个web应用程序,并需要构建一个相当复杂的搜索功能。当用户输入搜索词时,我希望能够搜索多种数据源,包括文档、数据库中的表格、网页URL以及一些API,比如Facebook。有什么提示、教程或提示将不胜感激。
从你的问题中可以看出,你可能不打算从头开始实现整个功能,因此以下是一些你可能会发现有用的链接。
一个(最简单的)选项是使用第三方搜索引擎(例如Google自定义搜索,但Bing可能有类似的API)。这允许你使用Google搜索(仅)你的页面,并以定制的方式显示结果。限制在于它仅搜索某些(链接)页面上显示的数据。
更复杂的方法是使用一些.NET库为您实现索引(基于您提供给它的数据)。一个流行的库是例如Lucene.Net。在这种情况下,您显式地提供要搜索的数据(来自网页的相关内容、数据库内容等),因此您可以更好地控制正在搜索什么(但需要更多的工作)。
我为我的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;