2010
08 05

網站全文搜索-使用Bing API實作 (上篇)

08:28:00   閱讀數 ( 637 )   回應數 ( 0 )
我們在設計網站時,常會需要製作網站全文搜尋這樣的功能,
以往我們會把大量的資料放入資料庫,再用SQL Statement來做多條件搜尋,
現在我們不用那麼麻煩了
微軟的 Bing 搜尋引擎 不止有強力搜尋的功能,它還提供了向面.Net相當友善的API,
讓我們趕快來看看要如何使用它。

首先要到 Bing Developer Center http://www.bing.com/developers 

申請的進入畫面

先在這邊申請你的 AppID,

填寫申請資料

基本上就是資料填一填,按下送出就可以了


然後你會得到你的AppID,

你的AppID

再來我們把AppID記下來後,
我們可以由MSDN上的 http://msdn.microsoft.com/en-us/library/dd250965.aspx 得知,

我們必需加入Web Reference到我們的專案中。

右鍵點選你的專案後,選擇加入Web參考

格式為:http://api.bing.net/search.wsdl?AppID=YourAppId&Version=2.2

填寫Web Reference的資料

接著我們可以看到,在加入的畫面我們可以自定該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;
		}
	}
}

有幾點要注意的是..
  1. 由於我們是要搜尋固定網站, 故在定義SearchRequest的時候,其中的Query參數必需格式化為 site:{目標Domain} {搜尋關鍵字}
  2. Market在範例的定義為en-us, 但是由於我們是搜尋中文網站, 故設定為zh-tw的搜尋結果會較完整
  3. 由於我們在SearchOption中設定了EnableHighlighting,所以在搜尋結果中,符合我們關鍵字的文字會以兩個特殊符號("\uE000"及"\uE001") 所以我們用一個ReplaceHightLightSign函式將它轉換為我們想要的<b></b>格式 

至此為止,我們已經完成資料來源的Manager,
其實有上面的程式碼就已經可以完成搜尋了,

下一篇我們再來實作與Asp.net MVC結合的部份 



2010-08-05 08:28:00 By RazgrizHsu       637 Visits

關於站長 About

RazgrizHsu 的大頭照o.o RazgrizHsu
程式設計之偉大航道
其中的一個小設計師
致力於開發技術研究
願能與各位一同成長!

大家來噗浪 Plurk

免責聲明 Disclaimer

  • 本站所轉載或引用之資料,其版權和知識產權屬於原始所有者。
  • 本站雖力求資料準確,但無法保證或擔保全數資料均準確無誤,許多資料具有時效或環境上的不同,在使用本站資料前應先行初步判斷,若是發現問題,歡迎您通知本站。
  • 在任何情況下,因本站所造成的直接、間接、偶然或其他衍生問題,本站不承擔任何責任。
RandomART程式道-88x31連結用Logo
Copyright © Runart.net 暴走的藝術 since 2009 - 2011
Design By Razgriz Hsu, Asp.net MVC 3 & SqlServer 2008R2.