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

使用 Windows Live Search 搜索您的网站(第 II 部分)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (4投票s)

2008 年 2 月 12 日

CPOL

2分钟阅读

viewsIcon

34311

我原创文章的更新,允许您使用 Windows Live Search 搜索您的个人网站。

引言

本文是我原创文章 使用 MSN Site Search 搜索您的网站 的后续。我注意到这篇文章仍然受到一些关注,所以我决定整理一个更新的版本。

此版本中的更改

  • 代码已更新为 Visual Studio 2008
  • 代码重构,以获得更好的封装和性能
  • 启用了 AJAX.NET 支持。演示现在已启用 Ajax
  • 更新了已弃用的 xml.xsl 转换调用
  • 修复了一些分页错误
  • 在源失败时添加一次重试
  • 更新名称为 Windows Live。
  • 改进了一般的显示输出

背景

在上面的示例中,我正在使用 Web 表单中键入的搜索字符串动态构建查询字符串。 然后我用 XSL 样式表解析 RSS 源并显示结果。 分页是通过将参数传递给 XSL 文件并在 XSL 中处理分页来实现的。 要查看此示例,请单击上面的链接。

Using the Code

正如您所看到的,搜索效果很好并且速度非常快。您可以尝试搜索我的网站,例如“ASP”或“XML”,以生成足够的搜索结果。

我正在提供我的代码供下载。 请随意下载并在您的网站上使用它。 它可以在任何运行 ASP.NET 的服务器上运行。 您只需更改两个变量即可个性化您网站中的搜索结果。 在 ASPX 文件中,您会找到两个变量 sitenameresultcountsitename 是您网站的完全限定域名,resultcount 指定要返回的结果总数。 您可能需要根据您拥有的内容量来调整此值。 每次查询下载的总结果越少,运行速度就越快。

.NET 代码

 Sub DisplaySearchResults()

        'check if user entered a search term.
        If term.Text <> "" Then

            Try

                'init
                Dim msnXmlSrc As String = MSNSearchURL & sitename & "+_
                         " & searchterm & "&format=rss&FORM=ZZRE&count=_
                         " & resultcount & "&first=" & start
                Dim msnXslFile As String = Server.MapPath(XslTranformFile)

                'load output into xml document.
                Dim msnXmlDoc As XmlDocument = New XmlDocument()
                msnXmlDoc.Load(msnXmlSrc)

                'set parameters.
                Dim arglist As XsltArgumentList = New XsltArgumentList()
                arglist.AddParam("top", "", top)
                arglist.AddParam("page", "", pagenum)
                arglist.AddParam("searchterm", "", searchterm)

                'Transform xml/xsl
                Dim out As HtmlGenericControl = _
                    TransformXml(msnXmlDoc, msnXslFile, arglist)

                'add control to placeholder
                If ResultPLC.Controls.Count > 0 Then ResultPLC.Controls.RemoveAt(0)
                ResultPLC.Controls.Add(out)

            Catch ex As Exception
                Try
                    'retry once
                    If failcount > 0 Then Throw New Exception(ex.Message)
                    failcount = failcount + 1
                    DisplaySearchResults()
                Catch ex2 As Exception
                    'message error
                    Dim litOut As New Literal
                    litOut.Text = ex2.Message()
                    ResultPLC.Controls.Add(litOut)
                End Try

            End Try

        Else
            Dim litOut As New Literal
            litOut.Text = "Please enter a search term."
            ResultPLC.Controls.Add(litOut)
        End If

    End Sub 

Public Function TransformXml(ByVal xmldoc As XmlDocument, ByVal stylesheet As String, _
    ByVal params As XsltArgumentList) As System.Web.UI.HtmlControls.HtmlGenericControl
        'init
        Dim m_TransformXml As New System.Web.UI.HtmlControls.HtmlGenericControl
        Dim sw As StringWriter = New StringWriter()
        Dim xslDoc As New XslCompiledTransform()

        Try
            'perform transformation
            xslDoc.Load(stylesheet)
            xslDoc.Transform(xmldoc, params, sw)

        Catch ex As Exception
            'bubble exception
            Throw New Exception(ex.Message())
        Finally
            'free memory
            sw.Dispose()
            xslDoc = Nothing
        End Try

        'return control
        m_TransformXml.InnerHtml = sw.ToString()
        sw.Dispose()
        Return m_TransformXml

    End Function 

XSLT 转换文件

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" />
  <xsl:param name="top" />
  <xsl:param name="page" />
  <xsl:param name="searchterm" />

  <xsl:template match="/">
    You searched for "<xsl:value-of select="$searchterm" />"<br />
    <hr />
    <xsl:for-each select="rss/channel/item">
      <xsl:if test="position() < ($top*($page+1)) + 1 and position() > $page * $top">
        <a href = "{link}">
          <span class="style1">
            <strong>
              <xsl:value-of select="title" />
            </strong>
          </span>
        </a>
        <br />
        <span class="style1">
          <xsl:value-of disable-output-escaping="no" 
                select="translate(substring(description,1,150),'/',' /')" />
          <xsl:value-of disable-output-escaping="no" select="' ...'" />
        </span>
        <br />
        <xsl:value-of select="link" />
        <br />
        <br />
      </xsl:if>
      <xsl:if test = "position()=last()">
        <hr />
        <div>
          <div class="paginate">
            <xsl:if test = "($page = 0) and ($top<last()-1)">
              <a href = "javascript:javascript:__doPostBack
                      ('LbHoldClick','{$page+1}');">next >

关注点

尽管 Microsoft 可能难以跟踪其源的使用位置,但 RSS 文件中的许可信息明确声明结果不得用于商业目的。 据我所知,Google API 对所有用户都是免费的,每天最多可进行 1,000 次搜索。 因此,如果您要构建商业网站,我建议您使用 Google 搜索 API,但如果您只是想在您的个人网站上实现一个出色的快速搜索,那么 MSN 网站搜索是一个不错的选择。 如果您决定在您的网站上使用此脚本,请发布一个链接,以便我可以看一看。

© . All rights reserved.