在windows mobile上必硬(bing)

weixin_33816946發表於2019-01-07

在windows mobile上必硬(bing)

Freesc Huang

http://fox23.cnblogs.com

摘要:前一陣子,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按鈕按下時,執行以下程式碼:

            //清理listview和combBox
        listView1.Items.Clear();
            listView1.Tag 
= null;
            cbRelated.Items.Clear();

            
using (LiveSearchService service = new LiveSearchService())
ExpandedBlockStart.gifContractedBlock.gif            
{
            
//BuildRequest用來配置我們的查詢請求.別急,馬上會提到
                    SearchRequest request = BuildRequest();
                    SearchResponse response 
= service.Search(request);

                
//DisplayResponse用來組織顯示查詢結果
                    DisplayResponse(response);
        }

 

BuildRequest定義如下:

ContractedBlock.gifExpandedBlockStart.gifBuildRequest
       private SearchRequest BuildRequest()
ExpandedBlockStart.gifContractedBlock.gif        
{
            SearchRequest searchReq 
= new SearchRequest();
        
            
//注意這裡AppId請自行修改
            searchReq.AppId = Properties.Resources.AppId;
            searchReq.Query 
= tbSearchString.Text;

            
//sourcetype 決定了本次查詢的型別
ExpandedSubBlockStart.gifContractedSubBlock.gif
            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 class MyNewsResult
ExpandedBlockStart.gifContractedBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif       
public string Date getset; }//日期
ExpandedSubBlockStart.gifContractedSubBlock.gif
       public string Title getset; }//標題
ExpandedSubBlockStart.gifContractedSubBlock.gif
       public string Snippet getset; }//新聞選段   
    }

 

 然後,我們來關注一下DisplayResponse函式:

ContractedBlock.gifExpandedBlockStart.gifDisplayResponse
       private void DisplayResponse(SearchResponse response)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
if (response.News != null &&
                response.News.Results 
!= null &&
                response.News.Results.Length 
> 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
        
//提取我們需要的資訊,以MyNewsResult的形式存放每條結果
                var results = from bingResults in response.News.Results
ExpandedSubBlockStart.gifContractedSubBlock.gif                              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)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
foreach (var rs in response.News.RelatedSearches)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        cbRelated.Items.Add(rs.Title);
                    }

                }

        
//將我們需要的結果標題新增到ListView
                foreach (var r in (MyNewsResult[])lvResult.Tag)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    lvResult.Items.Add(
new ListViewItem(r.Title.ToString()));
                }

            }

        }

 

最後,我希望在選中listView中的某一項的時候能夠顯示該新聞的日期和新聞選段。於是在lvResult的ItemActivate事件處理函式中我們新增如下程式碼: 

            MyNewsResult[] nr = (MyNewsResult[])lvResult.Tag;
            
if (nr != null)
ExpandedBlockStart.gifContractedBlock.gif            
{
                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:我沒有現成的程式碼,要靠各位自己)

去試試吧;-)

相關文章