在windows mobile上必硬(bing)
Freesc Huang
摘要:前一陣子,bing一直是很火的話題, 其市場佔有率最高日一度超過18%,不僅因為微軟強大的宣傳攻勢,也有"AV門"("必硬"的由來???)等因素的影響. 儘管對其搜尋質量褒貶不一, bing提供的門類越發豐富的bing API還是值得期待的。如果你對bing API還沒有概念,建議先閱讀馬寧童鞋的此文。本文將演示如何在移動裝置使用bing API 2.x打造一個簡易的新聞搜尋。
一. bing的移動版本
bing的移動版本已經上線。 你可以在手機瀏覽器位址列輸入m.bing.com訪問其web版本:
你也可以下載bing for windows mobile客戶端,通過http://mobile.search.live.com/client/download_manual.aspx
其效果如下圖所示:
不過目前大多數服務只在美國,英國,日本等處開放,中文版本的還需等待。
二. 在Windows Mobile 應用中使用bing API
在一切開始之前,首先你得去申請一個AppID(http://www.bing.com/developers/createapp.aspx),並妥善儲存。bing目前已經提供了眾多門類的API服務(SourceTypes),包括網頁,廣告,圖片,視訊,新聞,電話薄,翻譯,拼寫檢查等等。每一個門類都是一個相對獨立的垂直搜尋。你可以在應用程式中利用這些SourceTypes中的一個或者一些來構造一個自定義的搜尋相關應用。
這裡我希望編寫一個簡單的新聞搜尋,其基本功能如下:
1.每次返回查詢的前10條記錄
2.給出相關搜尋
3.可以檢視搜尋結果的釋出時間和新聞選段等資訊。
其介面主要由一個搜尋框(tbSearchString),一個用來顯示相關查詢的ComboBox(cbRelated),一個用來顯示結果的ListView(lvResult)和兩個Softkey Button組成,如圖所示:
ok, 接下來我們先新增一個對bing Web Service的引用, 服務URL為:http://api.search.live.net/search.wsdl
在Search按鈕按下時,執行以下程式碼:
listView1.Items.Clear();
listView1.Tag = null;
cbRelated.Items.Clear();
using (LiveSearchService service = new LiveSearchService())
{
//BuildRequest用來配置我們的查詢請求.別急,馬上會提到
SearchRequest request = BuildRequest();
SearchResponse response = service.Search(request);
//DisplayResponse用來組織顯示查詢結果
DisplayResponse(response);
}
BuildRequest定義如下:
private SearchRequest BuildRequest()
{
SearchRequest searchReq = new SearchRequest();
//注意這裡AppId請自行修改
searchReq.AppId = Properties.Resources.AppId;
searchReq.Query = tbSearchString.Text;
//sourcetype 決定了本次查詢的型別
searchReq.Sources = new SourceType[] { SourceType.News, SourceType.RelatedSearch };
searchReq.Market = "en-US";
//配置新聞的數目,排序方式等
searchReq.News = new NewsRequest();
searchReq.News.Count = 10;
searchReq.News.CountSpecified = true;
searchReq.News.SortBy = NewsSortOption.Relevance;
searchReq.News.SortBySpecified = true;
return searchReq;
}
接下來,為了方便安全地按照我們的需要儲存查詢結果,我們新增一個類MyNewsResult:
{
public string Date { get; set; }//日期
public string Title { get; set; }//標題
public string Snippet { get; set; }//新聞選段
}
然後,我們來關注一下DisplayResponse函式:
private void DisplayResponse(SearchResponse response)
{
if (response.News != null &&
response.News.Results != null &&
response.News.Results.Length > 0)
{
//提取我們需要的資訊,以MyNewsResult的形式存放每條結果
var results = from bingResults in response.News.Results
select new MyNewsResult() { Date = bingResults.Date,
Title = bingResults.Title,
Snippet = bingResults.Snippet };
//將結果儲存到listview的tag中以便繼續使用
lvResult.Tag = results.ToArray();
//將相關新聞查詢儲存至ComboBox
if (response.News.RelatedSearches != null &&
response.News.RelatedSearches.Length > 0)
{
foreach (var rs in response.News.RelatedSearches)
{
cbRelated.Items.Add(rs.Title);
}
}
//將我們需要的結果標題新增到ListView
foreach (var r in (MyNewsResult[])lvResult.Tag)
{
lvResult.Items.Add(new ListViewItem(r.Title.ToString()));
}
}
}
最後,我希望在選中listView中的某一項的時候能夠顯示該新聞的日期和新聞選段。於是在lvResult的ItemActivate事件處理函式中我們新增如下程式碼:
if (nr != null)
{
MessageBox.Show(nr[lvResult.SelectedIndices[0]].Snippet,
nr[lvResult.SelectedIndices[0]].Date);
}
到此,主要的工作我們已經完成了(完整的程式碼文章末尾有下載)。不妨來看看執行效果:
相關搜尋:
完整的程式碼 點選此處下載
最後出個練習題給有興趣的朋友:
如何利用bing打造一個基於GPS的垂直搜尋?
(提示1:SearchRequest有經緯度屬性)
(提示2:可以參考bing map sdk http://msdn.microsoft.com/en-us/library/dd877180.aspx)
(提示3:我沒有現成的程式碼,要靠各位自己)
去試試吧;-)