我們在設計網站時,常會需要製作網站全文搜尋這樣的功能,
以往我們會把大量的資料放入資料庫,再用SQL Statement來做多條件搜尋, 現在我們不用那麼麻煩了 微軟的 Bing 搜尋引擎 不止有強力搜尋的功能,它還提供了向面.Net相當友善的API, 讓我們趕快來看看要如何使用它。 首先要到 Bing Developer Center http://www.bing.com/developers ![]() 先在這邊申請你的 AppID, ![]() 基本上就是資料填一填,按下送出就可以了 然後你會得到你的AppID, ![]() 再來我們把AppID記下來後, 我們可以由MSDN上的 http://msdn.microsoft.com/en-us/library/dd250965.aspx 得知, 我們必需加入Web Reference到我們的專案中。 ![]() 格式為:http://api.bing.net/search.wsdl?AppID=YourAppId&Version=2.2 ![]() 接著我們可以看到,在加入的畫面我們可以自定該WebService的Namespace, 這邊就隨各人喜好囉,我定的Namespace是 "BingAPI" ![]() 接著就可以Codeing囉.. 我們可以在 Working with SourceTypes (Bing, Version 2) 找到相當多的範例, 由於這邊是要做網站的全文搜索,所以我們用的是Web 首先我們定義一個ViewModel,用來讓前台顯示資料..
/// <summary>搜尋結果的ViewModel</summary>
public class SearchView
{
/// <summary>搜尋關鍵字</summary>
public String Keyword { get; set; }
/// <summary>頁面的Index</summary>
public UInt32 PageIndex { get; set; }
/// <summary>訊息總筆數</summary>
public UInt32 ResultCount { get; set; }
/// <summary>錯誤訊息</summary>
public String ErrorMessage { get; set; }
/// <summary>錯誤訊息</summary>
public List<WebResult> Results { get; set; }
}
接著就是實作的部份囉, 這邊Random定義一個static class來實作.
/// <summary>執行搜尋的Manager</summary>
public static class SearchManager
{
private const UInt32 PageSize = 10;
private const String SiteHost = "RandomArt.tw"; //這邊填搜尋目標網址
/// <summary>依keyword建立搜尋參數</summary>
private static SearchRequest createRequestBy( String keyword, UInt32 pageSize, UInt32 pageIndex )
{
return new SearchRequest()
{
Query = String.Format( "site:{0} {1}", SiteHost, keyword ),
Market = "zh-tw",
Version = "2.0",
AppId = "1234567890", //這邊填寫你的AppID
AdultSpecified = true,
Adult = AdultOption.Moderate,
Sources = new SourceType[] { SourceType.Web },
Options = new SearchOption[] { SearchOption.EnableHighlighting },
Web = new WebRequest()
{
Count = pageSize,
CountSpecified = true,
Offset = pageIndex,
OffsetSpecified = true,
Options = new WebSearchOption[] { WebSearchOption.DisableHostCollapsing, WebSearchOption.DisableQueryAlterations }
}
};
}
/// <summary>取代搜尋結果中預設的HighLight符號為自定樣式</summary>
private static void ReplaceHightLightSign( WebResult item )
{
item.Title = item.Title.Replace( "\uE000", "<b>" ).Replace( "\uE001", "</b>" );
item.Description = item.Description.Replace( "\uE000", "<b>" ).Replace( "\uE001", "</b>" );
}
/// <summary>依所傳入的關鍵字執行搜尋後丟回結果</summary>
public static SearchView Search( String keyword, UInt32 page )
{
UInt32 pageIndex = ( page > 0 ) ? ( page - 1 ) : ( 0 );
using( var service = new BingService() )
{
var vm = new SearchView
{
Keyword = keyword,
PageIndex = pageIndex + 1
};
try
{
//建立搜尋參數
var searchRequest = createRequestBy( keyword, PageSize, pageIndex );
//執行搜尋
var searchResponse = service.Search( searchRequest );
if( searchResponse.Web.Results == null )
{
vm.ErrorMessage = "您的搜尋關鍵字查無資料";
}
else
{
vm.ResultCount = searchResponse.Web.Total;
vm.Results = searchResponse.Web.Results.ToList();
//ForEach所有的結果,將預設的HighLight符號取代為自定義的符號
vm.Results.ForEach( item => { SearchManager.ReplaceHightLightSign( item ); } );
}
}
catch( System.Web.Services.Protocols.SoapException ex )
{
vm.ErrorMessage = ex.Detail.InnerText;
}
catch( System.Net.WebException ex )
{
vm.ErrorMessage = ex.Message;
}
return vm;
}
}
}
有幾點要注意的是..
至此為止,我們已經完成資料來源的Manager, 其實有上面的程式碼就已經可以完成搜尋了, 下一篇我們再來實作與Asp.net MVC結合的部份
2010-08-05 08:28:00 By RazgrizHsu
637 Visits
|
文章分類 Category關於站長 About
大家來噗浪 Plurk武林高手連結 Links免責聲明 Disclaimer
|