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.
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.
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.
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.