Live Search XML Web Servisleri'ni Kullanarak Kendi Arama Motorunuzu Yaratın

0 dakikada yazıldı

7095 defa okundu

Düzenle

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.