جستجو با استفاده از وب سرویس گوگل - قسمت دوم

در قسمت قبل این مقاله دیدید که چگونه به کمک وب سرویس گوگل در وب جستجو می کنیم. در قسمت دوم خواهیم دید که چگونه می توان یک موتور جستجوی شبه گوگل ایجاد کرد.

ساختن یک موتور جستجوی کاربردی تر

برای ساختن یک موتور جستجوی کاربردی تر با وب سرویس گوگل، اجازه دهید تا یک صفحه وب ASP.NET بسازیم که به کاربر امکان وارد کردن عبارت مورد جستجو و همچنین صفحه بندی داده های بدست آمده از جستجو را بدهد. یک راه برای انجام این کار، تقلید از گوگل است به این معنی که کلمه مورد جستجو و شماره صفحات را در Query String قرار دهیم. به عنوان مثال اگر کاربر کلمه "ASP" را جستجو کند و 10 نتیجه از 20 نتیجه بدست آمده نمایش داده شود، آدرس درخواستی چیزی شبیه به این خواهد بود :
< BR>http://www.yourserver.com/Search.aspx?q=ASP&first=10&last=20

یک انتخاب دیگر استفاده از postback است. اما استفاده از Query String این حسن را دارد که کاربر می تواند نتایج یک جستجوی خاص را bookmark کند (توجه کنید که در روش postback به دلیل استفاده از هدرهای HTTP POST، آدرس و Query string موقع جستجو یا صفحه بندی نتایج تغییری نمی کنند).

با وجود مزیت bookmark شدن در روش Query String من تصمیم گرفتم تا کار را به کمک Postback در وب فرم ها انجام دهم، اما شما اگر بخواهید، می توانید روش Query String را تعریف و استفاده کنید. سورس کد روش Postback را در زیر مشاهده می کنید :

<script language="VB" runat="server">
  Const PAGE_SIZE as Integer = 5

  Sub execSearch(sender as Object, e as EventArgs)
    ViewState("startIndex") = 0
   
    DisplaySearchResults()
  End Sub
 
 
  Sub nextRecs(sender as Object, e as EventArgs)
    ViewState("startIndex") += PAGE_SIZE
   
    DisplaySearchResults()
  End Sub
 
 
  Sub prevRecs(sender as Object, e as EventArgs)
    ViewState("startIndex") -= PAGE_SIZE
   
    DisplaySearchResults()
  End Sub


  Sub DisplaySearchResults()
      searchResults.Visible = True
     
      Dim search As google.GoogleSearchService = New google.GoogleSearchService()
      Dim result as google.GoogleSearchResult
     
      result = search.doGoogleSearch("license key...", searchTerms.Text, _
                 ViewState("startIndex"), PAGE_SIZE, True, "", True, "", "", "")
     
      dlResults.DataSource = result.resultElements
      dlResults.DataBind()
     
      lblSearchResults.Text = "Viewing records " & String.Format("{0:#,###}", _
                ViewState("startIndex")+1) & " - " & _
                String.Format("{0:#,###}", ViewState("startIndex") + _
                PAGE_SIZE) & " of about " & _
                String.Format("{0:#,###}", result.estimatedTotalResultsCount) & _
                ".  Search took " & _
                String.Format("{0:0.000}", result.searchTime) & " sec."
               
      btnPrev.Enabled = (ViewState("startIndex") > 0)
  End Sub 
</script>

<form runat="server">
Enter your search term: <asp:TextBox runat="server" id="searchTerms" />
<asp:Button runat="server" Text="Search" OnClick="execSearch" />
<p>
<asp:panel id="searchResults" runat="server" Visible="False">
  <table width="100%" bgcolor="#eeeeee">
  <tr><td align="right">
    <asp:Label id="lblSearchResults" runat="server" />
  </td></tr>
  </table>

  <asp:DataList runat="server" id="dlResults"
        Font-Name="Verdana" Font-Size="10pt">

    <ItemTemplate>
      <span style="font-size:15pt;font-weight:bold;">
        <%# Container.DataItem.title %>
      </span><br />
      <%# Container.DataItem.snippet %><br />
      [<a href="<%# Container.DataItem.URL %>"><%# Container.DataItem.URL %></a>]
    </ItemTemplate>
 
    <SeparatorTemplate>
      <p> </p>
    </SeparatorTemplate>

  </asp:DataList>

  <table width="100%" bgcolor="#eeeeee">
  <tr><td align="right">
    <asp:LinkButton id="btnPrev" runat="server" Text="< Prev." OnClick="prevRecs" /> |
    <asp:LinkButton id="btnNext" runat="server" Text="Next. >" OnClick="nextRecs" />
  </td></tr>
  </table>
</asp:Panel>
</form>

[مشاهده نمونه کامل شده]



مهمترین و اصلی ترین و پر کارترین تابع در کد بالا DisplaySearchResults است که وب سرویس را فراخوانی می کند، داده ها را به دیتالیست مقید ( bind ) می کند و اطلاعات متفرقه در مورد نتیجه پیدا شده مثل عدد تخمینی تعداد نتایج، زمان اجرای کوئری و... را نمایش می دهد. این تابع همچنین فعال یا غیر فعال بودن دکمه لینکی مربوط به صفحه بندی نتایج را مشخص می کند.

هنگامی که وب سرویس را فراخوانی می کنیم، باید شاخص شروع نتایج و نیز تعداد نتایجی که می خواهیم در یک صفحه ببینیم را مشخص کنیم. برای اینکه 10 رکورد اول نتایج جستجو را ببینیم، عدد صفر را به عنوان شاخص شروع و عدد 10 را به عنوان تعداد رکوردهای بازگشتی پاس می کنیم. برای دیدن 10 نتیجه بعدی، فقط کافی است که عدد 10 را به عنوان شاخص شروع پاس کنیم (تعداد رکوردهای بازگشتی در این حالت هم همان 10 تاست). توجه کنید که ViewState برای مدیریت عدد شاخص شروع به کار رفته است. تعداد رکوردهایی که در هر صفحه نمایش داده می شوند توسط ثابت PAGE_SIZE مشخص می شود.

برای امکان صفحه بندی نتایج از دو دکمه لینکی استفاده شده است که وقتی روی آن ها کلیک می شود هندلرهای nextRecs و prevRecs شروع به کار می کنند. این هندلرها تنها عدد شروع رکوردها را به روز رسانی کرده و سپس DisplaySearchResults() را فراخوانی می کنند.

یک نکته مهم در رابطه با وب سرویس گوگل :

API وب سرویس گوگل در حال حاضر در مرحله تست بتا قرار دارد و تنها برای مصارف شخصی آماده شده است، برای محدود کردن استفاده افراطی، گوگل از استفاده کنندگان این سرویس می خواهد تا یک license key منحصر به فرد داشته باشند (که به صورت مجانی قابل دریافت است)، توضیح روش دریافت license key در قسمت اول این مقاله آمده است . این license key برای محدود کردن فراخوانی وب سرویس به کمتر از 1000 بار در روز استفاده می شود. لطفا api license terms را برای استفاده از وب سرویس گوگل مطالعه کنید.

منبع: Searching Google Using the Google Web Service