在windows mobile上必硬(bing)

在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按钮按下时,执行以下代码:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> // 清理listview和combBox
listView1.Items.Clear();
listView1.Tag
= null ;
cbRelated.Items.Clear();

using (LiveSearchServiceservice = new LiveSearchService())
ExpandedBlockStart.gifContractedBlock.gif
{
//BuildRequest用来配置我们的查询请求.别急,马上会提到
SearchRequestrequest=BuildRequest();
SearchResponseresponse
=service.Search(request);

//DisplayResponse用来组织显示查询结果
DisplayResponse(response);
}

BuildRequest定义如下:

ContractedBlock.gif ExpandedBlockStart.gif BuildRequest
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->privateSearchRequestBuildRequest()
ExpandedBlockStart.gifContractedBlock.gif
{
SearchRequestsearchReq
=newSearchRequest();

//注意这里AppId请自行修改
searchReq.AppId=Properties.Resources.AppId;
searchReq.Query
=tbSearchString.Text;

//sourcetype决定了本次查询的类型
ExpandedSubBlockStart.gifContractedSubBlock.gif
searchReq.Sources=newSourceType[]{SourceType.News,SourceType.RelatedSearch};
searchReq.Market
="en-US";

//配置新闻的数目,排序方式等
searchReq.News=newNewsRequest();
searchReq.News.Count
=10;
searchReq.News.CountSpecified
=true;
searchReq.News.SortBy
=NewsSortOption.Relevance;
searchReq.News.SortBySpecified
=true;

returnsearchReq;
}

接下来,为了方便安全地按照我们的需要保存查询结果,我们添加一个类MyNewsResult:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public class MyNewsResult
ExpandedBlockStart.gifContractedBlock.gif
{
ExpandedSubBlockStart.gifContractedSubBlock.gif
publicstringDate{get;set;}//日期
ExpandedSubBlockStart.gifContractedSubBlock.gif
publicstringTitle{get;set;}//标题
ExpandedSubBlockStart.gifContractedSubBlock.gif
publicstringSnippet{get;set;}//新闻选段
}

然后,我们来关注一下DisplayResponse函数:

ContractedBlock.gif ExpandedBlockStart.gif DisplayResponse
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->privatevoidDisplayResponse(SearchResponseresponse)
ExpandedBlockStart.gifContractedBlock.gif
{
if(response.News!=null&&
response.News.Results
!=null&&
response.News.Results.Length
>0)
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
//提取我们需要的信息,以MyNewsResult的形式存放每条结果
varresults=frombingResultsinresponse.News.Results
ExpandedSubBlockStart.gifContractedSubBlock.gifselect
newMyNewsResult(){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(varrsinresponse.News.RelatedSearches)
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
cbRelated.Items.Add(rs.Title);
}

}

//将我们需要的结果标题添加到ListView
foreach(varrin(MyNewsResult[])lvResult.Tag)
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
lvResult.Items.Add(
newListViewItem(r.Title.ToString()));
}

}

}

最后,我希望在选中listView中的某一项的时候能够显示该新闻的日期和新闻选段。于是在lvResult的ItemActivate事件处理函数中我们添加如下代码:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 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 sdkhttp://msdn.microsoft.com/en-us/library/dd877180.aspx

(提示3:我没有现成的代码,要靠各位自己)

去试试吧;-)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值