Makale Özeti

Kendi arama motorunuzu yaratma yolunda sırtınızı yaslayabileceğiniz alternatif arama motoları arasında giderek güçlenen Live.com arama motoruna ait XML Web Servislerinin kullanımını inceleyeceğimiz bu makalede arama filtrelerine de hızlı bir şekilde göz atıyor olacağız.

Makale

Hiç kendi arama motorunuzu programlamayı düşündünüz mü? Peki bu konuda hiç araştırma yaptınız mı? Emin olun hiç kolay bir iş değil. Onun yerine biraz kolaya kaçıp hazır arama motorlarından faydalanabiliriz. Gün geçtikçe gelişen Live arama motorunu kullanacağımız bu makalemizde ilk olarak arama motorunun XML web servislerini kullanabilmek için http://search.msn.com/developer adresinden Create and Manage Application IDs bölümüne girerek kendimize bir AppID (Uygulama Kimliği) yaratmamız gerekiyor.

Live Search AppID yaratma yolundayız.
Live Search AppID yaratma yolundayız.

AppID yaratma yolunda ilerlediğimizde bizden LiveID kimlik bilgilerimiz isteniyor. Giriş yaptıktan sonra arama motorumuzu kullanacağımız uygulamamızla ilgili bir anahtar isim verdikten sonra AppID'mizi hemen alabiliyoruz.

Live AppID'mizi uygulama ismi vererek alabiliyoruz.
Live AppID'mizi uygulama ismi vererek alabiliyoruz.

Tüm bu işlemleri tamamladıktan sonra artık http://soap.search.msn.com/webservices.asmx?wsdl adresindeki web servisini uygulamamızda kullanmaya başalayabiliriz. Projenize Solution Explorer içerisinde sağ tuş ile tıkladığınızda gelen menüden Add Web Reference seçeneğini seçerek tanımlama işlemlerini tamamlayabilirsiniz.

Kullanacağımız web servisini projemize web reference olarak ekliyoruz.
Kullanacağımız web servisini projemize web reference olarak ekliyoruz.

Live arama motoruna ait web servisini kullanırken özel sorgular hazırlayarak farklı arama filtreleri uygulama şansımız da var. Gelin, örneğimizde sadece üç site içerisinde arama yapan bir arama motoru oluşturalım. Kullanabileceğiniz filtreleme seçenekleri çok geniş olduğu için bu konuyu makalenin dahiline almayacağım, siz isterseniz http://msdn2.microsoft.com/en-us/library/aa905321.aspx adresinden geniş bilgi alabilirsiniz.

Kullanacağımız filtrelemede sadece belirli web siteleri içerisinde arama yaptırılarak sonuçların bize Live Search tarafından döndürülmesini istiyor olacağız. Bu nedenle ilk olarak yapacağım şey bize filtreleme sorgusunun metnini döndüren bir fonksiyon yazmak olacak.

    Function SorguYarat(ByVal Aranan) As String
        Dim Writer As New System.Text.StringBuilder
        Writer.Append(Aranan)
        Writer.Append(" (")
        Writer.Append("site:")
        Writer.Append("yazgelistir.com")
        Writer.Append(" OR ")
        Writer.Append("site:")
        Writer.Append("nedirtv.com")
        Writer.Append(" OR ")
        Writer.Append("site:")
        Writer.Append("microsoft.com.tr")
        Writer.Append(")")
        Return Writer.ToString
    End Function

Yukarıda hazırlamış olduğumuz fonksiyon bir StringBuilder tanımlayarak verdiğimiz metinleri aranacak olan metnin sonuna ard arda ekliyor. Aslına bakarsanız yolladığımız sorgu bu kod içerisinde sabit fakat ben özellikle bu şekilde yaparak sizin bu kodu veritabanına bağlamanızı kolaylaştırmak istedim. Böylece sitelerinin isimlerini eklediğimiz kodları bir döngü içerisinde kullanarak veritabanınızdan gelen site adlarını sorguya ekleyerek, içerisinde arama yapılacak sitelerin listesini dinamik olarak veritabanında çekebilirsiniz.

Şimdi sıra geldi arama işlemini yapacak olan fonksiyonu. Ben fonksiyonumu bir DataTable döndürecek şekilde yazacağım. Böyle yaparak fonksiyonumu ileride direk bir Repeater veya GridView'e bağlamamı kolaylaştırıyorum. Fonksiyonun ana yapısını oluşturmadan içerisindeki kodları yazalım.

        'Verileri depolayacağımız sana tablomuzu oluşturuyoruz.
        Dim MyData As New DataTable("Sonuclar")
        'Tablomuza toplam dört kolon ekleyeceğiz.
        MyData.Columns.Add(New DataColumn("Baslik"))
        MyData.Columns.Add(New DataColumn("Açıklama"))
        MyData.Columns.Add(New DataColumn("Görünen URL"))
        MyData.Columns.Add(New DataColumn("URL"))

Yukarıdaki kodlar ile MyData adında bir tablo yaratarak içerisine dört adet kolon ekliyorum. Bu kolonlardaki verileri yeri geldiğinde arama motorundan dönen sonuçlar ile dolduracağım. Live Search arama motorundan çok detaylı sonuçlar geliyor, isterseniz siz daha farklı kolonlar koyarak daha fazla veri alabilirsiniz. Benim için bu kadarı yeterli :)

        'Arama motorumuzu tanımlıyoruz.
        Dim MySearchEngine As New MSNSearchService
        'Arama talbeni değişkenimizi yaratıyoruz.
        Dim MySearchRequest As New SearchRequest
        MySearchRequest.AppID = "Aldığınız AppID buraya yazılacak."

Kodumuzun bu bölümünde arama servisimizi tanımlıyor sonra da arama talebimize ait ana değişkenimizi tanımlayarak AppID'mizi atıyoruz. AppID olarak yukarıda bahsettiğimiz Live web sitesinden almış olduğunuz kendi AppID değerini yazmanız gerekiyor.

        'Aranacak kaynaklar için talep oluşturuyoruz.
        Dim MySourceRequest(0) As SourceRequest
        MySourceRequest(0) = New SourceRequest
        'Kaç adet sonuç döneceğini fonksiyondan gelen parametre belirliyor.
        MySourceRequest(0).Count = Adet
        'Sadece web ortamını arayacağız.
        MySourceRequest(0).Source = SourceType.Web
        'Sonuçlardaki tüm bilgileri ve kolonları alıyoruz.
        MySourceRequest(0).ResultFields = ResultFieldMask.All
        'Arama sorgumuzu aktarıyoruz.
        MySearchRequest.Query = SorguYarat(Aranan)
        'Talebimizi talep listesine ekleyelim.
        MySearchRequest.Requests = MySourceRequest
        'Aşağıdaki kültür bilgisini isterseniz değiştirebilirsiniz.
        MySearchRequest.CultureInfo = "tr-TR"

Bu bölüm biraz karışık gibi gözükebilir. Benim tavsiyem kod içerisine yazdığım yorum satırlarını okuyarak ilerlemeniz. Önemli birkaç nokta var. Bunlardan ilki MySourceRequest(0).Count = Adet tanımlamasında yatıyor. Buraya verdiğimiz Adet değişkeni bizim fonksiyonumuza parametre olarak verilen bir değişken olacak. Kabaca aradığımız bilgiye dair kaç adet sonuç almak istediğimizi aktarıyoruz. Bir sonraki satırda web içeriği aradığımızı özellikle belirtmemiz gerekiyor, malum Live Search ile resim gibi farklı içerikler aratmak da mümkün. ResultFields satırına geldiğimizde ise sonuçlara dair tüm bilgileri istediğimizi belirtiyoruz. Belki bu noktada biraz optimizasyona gidilerek kullanmayacağımız bilgileri istemeyebilirdik. Query özelliğine geldiğimizde ise daha önce yaratmış olduğumuz SorguYarat fonksiyonunu çalıştırarak sorgumuzu aramaya aktarıyoruz. Bu yapıda aslında istersek birden çok arama yaratarak bir talep listesi olarak topluca web servisine gönderebiliriz. Bizim örneğimizde aramaları tek tek göndereceğiz. En son satırda da arama yaptıracağımız dilin kültür bilgisini aktarıyoruz.

        'Sıra geldi sonuçları almaya.
        Dim MySearchResponse As New SearchResponse
        'Aramamızı gönderip sonuçları alıyoruz.
        MySearchResponse = MySearchEngine.Search(MySearchRequest)

Artık sıra geldi aramayı motora aktarmaya ve sonuçları almaya. Bir sonuç değişkeni tanımlayarak önceden tanımladığımız arama motoru değişkenimiz ile taleplerimizi XML web servisine gönderiyoruz.

        'Sonuçlar arasında gezerek kendi tablomuza aktaracağız.
        For Each IncResponse As SourceResponse In MySearchResponse.Responses
            Dim MyResults() As Result
            MyResults = IncResponse.Results
 
            Dim ResultRow As DataRow
            'Sonuç sayısı sıfırdan yüksekse aktarmayı başlatalım.
            If IncResponse.Total > 0 Then
                For Each MyResult As Result In MyResults
                    ResultRow = MyData.NewRow
                    'Tek tek gelen bilgileri kendi yarattığımız
                    'tablomuza döngü içerisinde satır satır ekliyoruz.
                    ResultRow.Item(0) = MyResult.Title
                    ResultRow.Item(1) = MyResult.Description
                    ResultRow.Item(2) = MyResult.DisplayUrl
                    ResultRow.Item(3) = MyResult.Url
                    MyData.Rows.Add(ResultRow)
                Next
            End If
        Next

Gelen sonuçlar arasında bir For Each döngüsü ile dolaşırken bir yandan da sonuçlardaki bilgileri kendi yarattığımız tablomuza satır satır ekliyoruz. Tüm bu işlemler tamamlandıktan sonra fonksiyonumuz tablomuzu geri döndürüyor olacak. Fonksiyonumuz tam kodu aşağıdaki şekilde sonuçlanıyor.

    Function Ara(ByVal Aranan As String, ByVal Adet As Integer) As DataTable
        'Verileri depolayacağımız sana tablomuzu oluşturuyoruz.
        Dim MyData As New DataTable("Sonuclar")
        'Tablomuza toplam dört kolon ekleyeceğiz.
        MyData.Columns.Add(New DataColumn("Baslik"))
        MyData.Columns.Add(New DataColumn("Açıklama"))
        MyData.Columns.Add(New DataColumn("Görünen URL"))
        MyData.Columns.Add(New DataColumn("URL"))
 
        'Arama motorumuzu tanımlıyoruz.
        Dim MySearchEngine As New MSNSearchService
        'Arama talbeni değişkenimizi yaratıyoruz.
        Dim MySearchRequest As New SearchRequest
        MySearchRequest.AppID = "Aldığınız AppID buraya yazılacak."
 
        'Aranacak kaynaklar için talep oluşturuyoruz.
        Dim MySourceRequest(0) As SourceRequest
        MySourceRequest(0) = New SourceRequest
        'Kaç adet sonuç döneceğini fonksiyondan gelen parametre belirliyor.
        MySourceRequest(0).Count = Adet
        'Sadece web ortamını arayacağız.
        MySourceRequest(0).Source = SourceType.Web
        'Sonuçlardaki tüm bilgileri ve kolonları alıyoruz.
        MySourceRequest(0).ResultFields = ResultFieldMask.All
        'Arama sorgumuzu aktarıyoruz.
        MySearchRequest.Query = SorguYarat(Aranan)
        'Talebimizi talep listesine ekleyelim.
        MySearchRequest.Requests = MySourceRequest
        'Aşağıdaki kültür bilgisini isterseniz değiştirebilirsiniz.
        MySearchRequest.CultureInfo = "en-US"
 
        'Sıra geldi sonuçları almaya.
        Dim MySearchResponse As New SearchResponse
        'Aramamızı gönderip sonuçları alıyoruz.
        MySearchResponse = MySearchEngine.Search(MySearchRequest)
 
        'Sonuçlar arasında gezerek kendi tablomuza aktaracağız.
        For Each IncResponse As SourceResponse In MySearchResponse.Responses
            Dim MyResults() As Result
            MyResults = IncResponse.Results
 
            Dim ResultRow As DataRow
            'Sonuç sayısı sıfırdan yüksekse aktarmayı başlatalım.
            If IncResponse.Total > 0 Then
                For Each MyResult As Result In MyResults
                    ResultRow = MyData.NewRow
                    'Tek tek gelen bilgileri kendi yarattığımız
                    'tablomuza döngü içerisinde satır satır ekliyoruz.
                    ResultRow.Item(0) = MyResult.Title
                    ResultRow.Item(1) = MyResult.Description
                    ResultRow.Item(2) = MyResult.DisplayUrl
                    ResultRow.Item(3) = MyResult.Url
                    MyData.Rows.Add(ResultRow)
                Next
            End If
        Next
        'Tablomuzu geri döndürüyoruz.
        Return MyData
    End Function

Aslında Live Search arama motoru ile ilgili işlemlerimiz tamamlandı. İsterseniz gelin şimdi hızlı bir şekilde yarattığımız fonksiyonu kullanmak üzere bir web sayfası hazırlayalım. Sayfamıza tasarım endişesi olmadan bir metin kutusu, arama işlemini başlatacak bir düğme ve bir de arama sonuçlarını hemen gösterecek GridView ekleyeceğiz. Tüm bunları bir UpdatePanel içerisine ekleyerek tüm sayfada AJAX kullanacağız. Profesyonel çalışmalarda benim tavsiyem arama sonuçlarını göstermek için GridView yerine güzel tasarlanmış bir Repeater kullanmanız ve tüm sayfayı kapsayacak UpdatePanel'lerden olabildiğince kaçmanız. Performans açısından pek anlamlı bir çözüm değil. Biz konumuza dönelim ve hemen uygulamaya geçelim.

<%@ Page Language="VB" AutoEventWireup="true" CodeFile="Default.aspx.vb" Inherits="_Default" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>Untitled Page</title>
</head>
<body>
  <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <div>
      <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
          <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
          <asp:Button ID="Button1" runat="server" Text="Ara" OnClick="Button1_Click" /><br />
          <asp:GridView ID="GridView1" runat="server">
          </asp:GridView>
        </ContentTemplate>
      </asp:UpdatePanel>
    </div>
  </form>
</body>
</html>

Sayfamızın HTML kodu yukarıdaki şekilde olacak. Sunucu tarafındaki kodumuza baktığımızda ise hazırladığımız fonksiyonlar sayesinde aslında arama işleminin ne kadar kolaylaştığını görüyor olacaksınız.

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        GridView1.DataSource = Ara(TextBox1.Text, 10)
        GridView1.DataBind()
    End Sub;

Gördüğünüz gibi yaptığımız tek şey hazırladığımzı Ara fonksiyonuna aranacak metni ve kaç tane sonuç istediğimizi parametre olarak vermek. Fonksiyon geriye bir DataTable döndüreceği için direk GridView'a bağlayabiliyoruz.

Projemizin code-behind sayfasında kodların tamamı aşağıdaki şekilde sonlanıyor.

Imports System.Data
Imports com.msn.search.soap
 
Partial Class _Default
    Inherits System.Web.UI.Page
 
    Function SorguYarat(ByVal Aranan) As String
        Dim Writer As New System.Text.StringBuilder
        Writer.Append(Aranan)
        Writer.Append(" (")
        Writer.Append("site:")
        Writer.Append("yazgelistir.com")
        Writer.Append(" OR ")
        Writer.Append("site:")
        Writer.Append("nedirtv.com")
        Writer.Append(" OR ")
        Writer.Append("site:")
        Writer.Append("microsoft.com.tr")
        Writer.Append(")")
        Return Writer.ToString
    End Function
 
    Function Ara(ByVal Aranan As String, ByVal Adet As Integer) As DataTable
        Dim MyData As New DataTable("Sonuclar")
        MyData.Columns.Add(New DataColumn("Baslik"))
        MyData.Columns.Add(New DataColumn("Açıklama"))
        MyData.Columns.Add(New DataColumn("Görünen URL"))
        MyData.Columns.Add(New DataColumn("URL"))
 
        Dim MySearchEngine As New MSNSearchService
        Dim MySearchRequest As New SearchRequest
        MySearchRequest.AppID = "Aldığınız AppID buraya yazılacak."
 
        Dim MySourceRequest(0) As SourceRequest
        MySourceRequest(0) = New SourceRequest
        MySourceRequest(0).Count = Adet
        MySourceRequest(0).Source = SourceType.Web
        MySourceRequest(0).ResultFields = ResultFieldMask.All
        MySearchRequest.Query = SorguYarat(Aranan)
        MySearchRequest.Requests = MySourceRequest
        MySearchRequest.CultureInfo = "en-US"
 
        Dim MySearchResponse As New SearchResponse
        MySearchResponse = MySearchEngine.Search(MySearchRequest)
 
        For Each IncResponse As SourceResponse In MySearchResponse.Responses
            Dim MyResults() As Result
            MyResults = IncResponse.Results
 
            Dim ResultRow As DataRow
            If IncResponse.Total > 0 Then
                For Each MyResult As Result In MyResults
                    ResultRow = MyData.NewRow
                    ResultRow.Item(0) = MyResult.Title
                    ResultRow.Item(1) = MyResult.Description
                    ResultRow.Item(2) = MyResult.DisplayUrl
                    ResultRow.Item(3) = MyResult.Url
                    MyData.Rows.Add(ResultRow)
                Next
            End If
        Next
        Return MyData
    End Function
 
    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        GridView1.DataSource = Ara(TextBox1.Text, 10)
        GridView1.DataBind()
    End Sub
End Class

Hepinize kolay gelsin.

Daron Yöndem
MCPD, MCITP, MCTS, MCSD, MCAD
MCDBA, MCP, ACP, ICSD, IEL'03
http://daron.yondem.com

Örnek uygulamamızın proje kodlarını bilgisayarınıza indirebilirsiniz.