65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 .NET 的必应搜索 API 基础知识

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (35投票s)

2009年10月31日

CPOL

11分钟阅读

viewsIcon

348423

downloadIcon

3592

本文将使您能够使用 Bing 搜索 API 为您的应用程序添加自定义搜索规则,以及更多功能。

bing-Logo.jpg


目录

引言

互联网是我们今天如此依赖的世界。互联网是我们生活中最重要的部分之一。互联网的核心在于搜索引擎。我们大多数人使用互联网只是为了获取未知的信息。为了获取知识,我们使用搜索引擎。搜索引擎使用网络爬虫功能从各种网站收集信息并将其提供给我们。当我们想到互联网时,第一个想到的词就是谷歌。谷歌是最著名的搜索引擎,几乎拥有一个人可能想到的所有答案。

微软也有搜索引擎,但它们从未能与谷歌的卓越相媲美。因此,在过去的几十年里,谷歌一直是全世界主要的搜索引擎,直到今年微软首次推出了必应。必应是一个智能搜索引擎,它像爬虫一样收集一切,但它会优先排序最相关的项目,这样用户就可以花费更少的时间来获取他们需要的最有价值的信息。您可以通过以下链接找到必应最近推出的所有功能:
必应的重要功能 [^]

必应还为开发者提供了一项卓越的服务。它鼓励开发者在自己的应用程序中使用其搜索 API。我将在本文中讨论必应搜索 API。文章包含一个示例应用程序,但由于我是 WPF 的新手,我已将其制作得尽可能简单。

特点

必应 API 为开发者提供了构建能够实现以下功能的应用程序的途径:

  • 在需要时从搜索引擎检索有价值的信息。
  • 即时获得问题的答案
  • 为用户检索电话号码。
  • 通过广告实现应用程序盈利。
  • 添加即时新闻文章等等

如何在您的应用程序中使用必应 API

必应 API 提供三种协议供您在请求中使用

  • 基于 JSON 的方法
  • 基于 XML 的方法
  • 基于 SOAP 的方法
这些协议可用于从服务器检索信息。但在执行此操作之前,您需要通过创建新的 ApplicationID 来注册才能使用必应服务。为此,请按照以下步骤操作:
  1. 打开您的浏览器,指向 必应开发者中心
  2. 进入页面后,按照页面下方所示的“登录”链接。
    APIKeyRegister.JPG
  3. 使用您的 Live ID 登录。(如果您还没有,则需要创建一个新的)
  4. 现在,填写表单以注册您的应用程序密钥,如上图所示。
    Registration.JPG
  5. 最后,您将在列表中看到您注册的密钥。
    APIkeyList.JPG

该密钥必须用于每次请求服务才能正确工作。现在我将逐一讨论每种协议,同时我们的主要关注点是使用 SOAP 构建应用程序。我将提供其他协议的一些基本示例,让您对其有所了解。

源类型

必应提供许多源类型。让我们来看看它们:
源类型描述
WEB此源类型搜索查询字符串,并根据其内置的自动化排名算法为您提供可用爬取结果的列表。这代表了必应服务的基本搜索算法。
IMAGE返回与查询相关的图像列表。
VIDEO返回搜索查询的视频结果列表
AD返回与查询相关的广告链接
新闻基于当前查询的、根据传递的地点(如果适用)的新闻条目。
RELATEDSEARCH一项独特的功能,使必应服务能够自动确定与当前搜索相关的搜索并显示结果。
SPELL拼写功能可根据其数据库自动确定查询中单词的正确拼写。
TRANSLATE它根据指定的目标语言 ID,将传递给必应服务的最多三个句子从一种语言翻译成另一种语言。
INSTANTANSWER这是另一项独特功能,可让您从当前查询中获得即时答案。它会为您的问题提供权威性答案。
PHONEBOOK正如您所想象的,它会搜索电话号码。这是必应服务的另一项出色功能。
MOBILEWEB为移动浏览器返回精简的输出。
基于这些源类型,您可以生成特定的输出。结果可能从普通的搜索选项到甚至为您的应用程序提供两种不同语言之间的翻译。

基于 JSON 的方法

基于 JSON(JavaScript 对象表示法)的方法是最简化的方法,其中仅通过适当的 URL 向服务器发出请求。我们创建一个包含 ApplicationId、Search Criteria、Nos of Offset 等的字符串,然后相应地连接服务器。服务器将返回一个 JSON 字符串作为响应。当我们需要 AJAX 调用服务器且没有服务器端处理选项时,此方法很有用。

要使用 JSON 方法调用请求,我们通过以下 URL 连接服务器: http://api.search.live.net/json.aspx
需要注意的是,每次调用服务器都需要传递一些参数。

  • 所有源类型共有的必需属性
    1. AppId:这是必需字段,必须放在每个请求的查询字符串中。AppId 的值可以在注册 必应 SDK 后找到。
    2. Query:此字段表示将生成结果的主要搜索字符串。这也是一个必填字段。
    3. Sources:它指示在查询字符串中指定字符串的位置。这也是生成输出的必填条件。SourceType 通常有多种类型,将在后续部分详细讨论。
  • 所有源类型共有的可选参数
    1. Version:这指示应使用哪个版本的必应 API 来生成搜索输出。我们需要在此指定 2.0,因为当前版本是 2.0。如果您需要使用任何其他版本,则需要相应地更改您的程序。此字段是可选的。
    2. Market:用于指定可能用于过滤搜索项的区域设置。值应为有效的区域设置字符串(例如,en-Us、fr-Fr、hi-In 等)。
    3. Adult:它指示搜索时应显示多少成人内容。默认值为“Moderated”(已审核)。
    4. Options:有一些选项可指示是否需要突出显示搜索字符串。我们使用 **EnableHighlighting** 来确保搜索字符串在结果中突出显示。我们还可以使用 **DisableLocationDetection** 来禁用当前搜索条件的位置搜索。
  • 特定于源类型的参数,源类型: **WEB**
    1. Web.Count:这表示调用搜索时要返回的结果数。
    2. Web.Offset:指定在选择结果之前必须跳过的结果数。例如,如果我们想要起始元素,则传递偏移量为 0。
    3. Web.Options:有两个选项可用于自定义输出。**DisableHostCollapsing** 指示是否列出不可用的主机。**DisableQueryAlterations** 指示在 Web 数据更改时是否会更改查询。
  • 特定于源类型的参数,源类型: **IMAGE**
    1. Image.Count:表示要返回的图像结果的数量。
    2. Image.Offset:要跳过的图像数量。
  • 特定于源类型的参数,源类型: **AD**
    1. Ad.MlAdCount:表示单次搜索中需要显示的头条广告数量。
    2. Ad.SbAdCount:表示侧边栏广告数量。
    3. Ad.ChannelId:广告的频道标识符,以便将合适的广告展示给合适的应用程序。
  • 特定于源类型的参数,源类型: **PhoneBook**
    1. Phonebook.FileType:这是要搜索号码的文件类型。它有两个值:`YP(商业)` / `WP(住宅)`。
    2. Phonebook.SortBy:号码排序。
  • 特定于源类型的参数,源类型: **News**
    1. News.LocationOverride:表示新闻文章应在哪里的位置。
    2. News.Category:要过滤的新闻类别。
    3. News.SortBy:排序元素。
  • 特定于源类型的参数,源类型: **Translate**
    1. Translation.SourceLanguage:翻译操作期间源语言的代码。
    2. Translation.TargetLanguage:翻译操作期间目标语言的代码。
以上是在创建不同搜索类型过程中必须指定的参数。还有更多字段可供您使用。请参阅 MSDN 获取完整的选项列表。

因此,我们的 JSON 搜索调用将如下所示:
http://api.bing.net/json.aspx?AppId=YOUR_APPID&Version=2.0&Market=en-US&Query=abhishek+sur&Sources=web+spell&Web.Count=1
如果我们查看 JSON 响应字符串,它将如下所示:

{
    "SearchResponse":{
         "Version":"2.0",
         "Query":{
                "SearchTerms":"abhishek sur"
          },
          "Web":{
          "Total":48800,
          "Offset":0,
          "Results":[
{"Title":"CodeProject: Member Profile: Abhishek Sur. Free source code and ...",
"Description":"Member Profile: Abhishek Sur - Free source code and tutorials for Software developers and Architects.",
"Url":"http:\/\/www.codeproject.com\/script\/Membership\/View.aspx?mid=4293807",
"DisplayUrl":"www.codeproject.com\/script\/Membership
\/View.aspx?mid=4293807",
"DateTime":"2009-10-28T17:49:30Z"
                        }]
          }
     }
}
 
因此,我们可以看到,如果您将 `YOUR_APPID` 替换为您的相应 ID 并在浏览器中运行此 URL,您将看到我的 Codeproject 个人资料。
现在让我们看一下完整的代码:
    var qry = 'abhishek sur';
    var src= 'Web';
    function Search()
    {
        var requestStr = "http://api.search.live.net/json.aspx?"
            + "AppId=" + AppId + "&Query=" + qry + "&Sources=" + src + "&Version=2.0"
            + "&Market=en-us" + "&Adult=Moderate" + "&Web.Count=10" + "&Web.Offset=0"
            + "&Web.Options=DisableHostCollapsing+DisableQueryAlterations"

            // JSON-specific request fields (optional)
            + "&JsonType=callback"
            + "&JsonCallback=SearchCompleted";

        var requestScript = document.createElement("script");
        requestScript.type = "text/javascript";
        requestScript.src = requestStr;
        
        var head = document.getElementsByTagName("head");
        head[0].appendChild(requestScript);
    }

    function SearchCompleted(response)
    {
        var errors = response.SearchResponse.Errors;
        if (errors != null)
        {
            //load error....
        }
        else
        {
            DisplayResults(response);
        }
    }

    function DisplayResults(response)
    {
        var output = document.getElementById("output");
        var results = response.SearchResponse.Web.Results;
        var resultList = document.createElement("ul");
        output.appendChild(resultList);
        // Display the results header.
        resultsHeader.innerHTML = "Web results for " + response.SearchResponse.Query.SearchTerms
            + "
Displaying " + (response.SearchResponse.Web.Offset + 1)+ " to "
            + (response.SearchResponse.Web.Offset + results.length) 
+ " of "+ response.SearchResponse.Web.Total
            + " results
";
               
        var resultsListItem = null;
        var resultStr = "";
        for (var i = 0; i < results.length; ++i)
        {
            resultsListItem = document.createElement("li");
            resultsList.appendChild(resultsListItem);
            resultStr = "%5C%22%22">" + results[i].Title + "
"
                + results[i].Description + "
Last Crawled: " + results[i].DateTime
                + "

";
            resultsListItem.innerHTML = resultStr;
        }
    }
执行此代码后,它将创建搜索结果项的前 10 个列表,并使用 Ul/Li 在列表中显示它们。

基于 XML 的方法

我们可以使用基于 XML 的方法来为我们的应用程序使用必应服务。它会生成 HTTP GET 请求以获取当前查询语句的 XML 响应。如果我们使用的应用程序无法处理复杂的 SOAP 请求响应,我们可以将其作为一个选项。您只需在应用程序中创建一个 WebRequest 对象,并使用带有结果条件的查询字符串,然后从中获取响应 XML。

要调用 XML 请求,我们通过此 URL 连接服务器:
http://api.bing.net/xml.aspx

现在,正如我在 JSON 方法部分已经提到过的基本查询字符串属性,我将不再重复。让我们快速看一下查询字符串的样子:
http://api.bing.net/xml.aspx?AppId=YOUR_APPID&Version=2.2&Market=en-US&Query=abhishek+sur&Sources=web+spell&Web.Count=1

如果我们用相应的 AppId 替换 YOUR_APPID 并从该 URL 获取响应,它将是:
<?pageview_candidate ?>
<SearchResponse Version="2.2">
  <Query>
     <SearchTerms>abhishek sur</SearchTerms>
   </Query>
    <web:Web>
        <web:Total>48800</web:Total>
        <web:Offset>0</web:Offset>
        <web:Results>
             <web:WebResult>
              <web:Title>
               CodeProject: Member Profile: Abhishek Sur. Free source code and ...
             </web:Title>
             <web:Description>
             Member Profile: Abhishek Sur - Free source code and tutorials for Software developers 
             and Architects.
             </web:Description>
             <web:Url>
              https://codeproject.org.cn/script/Membership/View.aspx?mid=4293807
             </web:Url>
             <web:CacheUrl>
              http://cc.bingj.com/cache.aspx?q=abhishek+sur
              &d=4730799138997872&mkt=en-US&w=711d76ec,f208163f
             </web:CacheUrl>
            <web:DisplayUrl>
             www.codeproject.com/script/Membership/View.aspx?mid=4293807
            </web:DisplayUrl>
            <web:DateTime>2009-10-28T17:49:30Z</web:DateTime>
         </web:WebResult>
       </web:Results>
   </web:Web>
</SearchResponse>
因此,我们可以轻松地在任何语言中解析此 WebResponse 对象并在应用程序中显示。如果您使用的是 .NET,则可以创建
string requestString = "http://api.bing.net/xml.aspx?
AppId=YOUR_API&Version=2.2&Market=en-US&Query=abhishek+sur
&Sources=web+spell&Web.Count=1";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestString);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
XmlDocument document = new XmlDocument();
document.Load(response.GetResponseStream());
// Now parse it....
希望您自己可以解析 `XmlDocument`。您也可以使用 `XDocument` 而不是 `XmlDocument` 来利用响应中的 `LINQ`,并使工作更加轻松。

基于 SOAP 的方法

这是最复杂的方法,它消除了 XML 协议的 HTTP GET 请求的限制,并确保创建基于 SOAP 的请求对象,该对象通过 Post 请求发送,并通过 SOAP 协议接收响应。服务器上运行的服务基本上是一个 WCF 服务,它实现 BasicHttpBinding 以类似于普通 Web 服务的方式工作。此方法可以与 .NET 等高级技术一起使用。我将使用 .NET 来演示如何构建应用程序。

创建基于 SOAP 的 .NET 应用程序的步骤

  1. 打开 Visual Studio,创建一个新项目。您可以选择任何项目类型。在示例应用程序中,我使用了 WPF 应用程序。
  2. 为您的项目添加 Web 引用。您应该使用的路径是:
    http://api.search.live.net/search.wsdl?AppID=YOUR_APPID
    AddService.JPG
  3. 现在创建一个 `LiveSearchPortTypeClient` 对象,它是基本终结点类。让我们看看下面的代码:
    public string SearchOutput(string AppId, string query, int offset, int no_of_res)
    {
        using (LiveSearchService service = new LiveSearchService())
            {
                try
                {
                    SearchRequest request = new SearchRequest();
                    request.AppId = AppId;
            	     request.Query = query;
                    request.Sources = new SourceType[] { SourceType.Web }; //You may specify multiple
                    request.Version = "2.0";
    	           request.Market = "en-us";
    	           request.Adult = AdultOption.Moderate;
    	           request.AdultSpecified = true;
                     request.Web = new WebRequest();
    	           request.Web.Count = no_of_res;
    	           request.Web.CountSpecified = true;
    	           request.Web.Offset = offset;
                    SearchResponse response = service.Search(request);
                    return GetResponsestring(response);
                 }
                catch (Exception ex)
                {
                    return ex.Message;
                }
           }
    } 
    
    在这里,我们调用对必应服务器的请求并获取响应。响应对象将保存当前搜索的结果集。
  4. 我们可以传递 `Offset`(表示当前搜索的跳过元素,0 表示从第一个开始显示)和 `Count`(表示要获取的结果数)来获取所需的结果。

SampleApplicationInfo.JPG

结果对象中可能有用的一些属性

有几个属性在生成所需的搜索结果时可能非常有用。我将在这里讨论其中的一些:

  • WebResult.Title:指定结果字符串的标题元素。
  • WebResult.Description:链接的简短描述。
  • WebResult.Url:指向当前结果的 URL。
  • ImageResult.MediaUrl:返回指向完整尺寸图像的 URL。
  • ImageResult.ContentType:这是结果中图像的 Mime 类型。
  • ImageResult.Thumbnail.Url:表示对应于结果缩略图尺寸图像的 URL。
  • InstantAnswerResult.ClickThroughUrl:表示包含查询答案的必应 URL。
  • NewsResult.BreakingNews:标识新闻是否为突发新闻。1 表示“突发新闻”,0 表示不是。
  • TranslationResult.TranslatedTerm:返回源指定的翻译字符串结果。
除这些之外,还有更多属性可能派上用场。您可以参考 MSDN 链接 [^] 在创建应用程序时获取每个属性的描述。

参考

http://msdn.microsoft.com/en-us/library/dd251020.aspx [^]

关注点

在此应用程序中,我添加了一个示例应用程序。该应用程序是使用 WPF 编写的。我现在只添加了普通的 Web 搜索。稍后我将添加其他 SourceType 选项。

另外请注意,我是 WPF 新手,所以在示例应用程序的这个版本中,您可能对外观和感觉不满意。我稍后会用更高级的示例应用程序进行更新。

您可以在此处找到示例应用程序的第一版:
下载 SearchAPISample.zip - 200.46 KB

历史

初始发布:2009 年 11 月 31 日

使用 .NET 的必应搜索 API 基础知识 - CodeProject - 代码之家
© . All rights reserved.