Üye Kayıt Üye Giriş

Bunu mu demek istediniz? Google Bunu Nasıl Yapıyor


Bunu mu demek istediniz? Google Bunu Nasıl Yapıyor

 

Hepimiz Google'da arama yaptığımız zaman "bunu mu demek istemiştiniz" ifadesi ile karşılaşmışızdır. Hatta bazılarımız bu google ne ukala bile demiştir. Bugün bizde arama sayfamıza bu özelliği nasıl ekleyeceğimizi öğreneceğiz. Tabiki google bunu yaparken bizden çok daha farklı yapıyor olacak, biz bu işlemi sql server veritabanı üzerinden yapacağız. Bunu yapmadan önce ise t-sql de DIFFERENCE ve SOUNDEX fonksiyonlarının kullanımına değinmemiz gerekiyor. 

SOUNDEX Fonksiyonu:

SOUNDEX fonksiyonu  parametre olarak bir metin alır ve bu metnin okunuşunu ifade eden 4 karakterli bir değer döndürür. Geriye döndürdüğü 4 karakterli değerin ilk karakteri aradığımız kelimenin ilk harfidir.

select SOUNDEX('yazilimmutfagi')  --ifadesi sonuç olarak bize Y245 değerini döndürür.

 

select SOUNDEX('yazilimmutfagi'),SOUNDEX('yazilimutfagi')


şeklinde aradaki m lerden birini silersek sonuç olarak iki ifade içinde  ifadesi döner. Yani iki ifade de sql bize aynı kelimeden bahsettiğimizi söylüyor. Sonuç olarak soundex fonksiyonunu kullanarak kelimeleri karşılaştırıp aynı olup olmadığını bulabiliriz.

DIFFERENCE Fonksiyonu :

DIFFERENCE fonksiyonu iki adet parametre alır ve aldığı parametreleri SOUNDEX fonksiyonuna tabi tutarak dönen 4 karakterli sonuçları karşılaştırır. Dönen 4 karakterli sonuçların kaç karakterinin aynı olduğunu ifade eden 0 ile 4 arasında bir sonuç döndürür.

select DIFFERENCE('metin1','metin2')


şimdi ahmet ve akmet kelimelerini ilk olarak soundex fonksiyonuna gönderelim ve dönen sonuçları inceleyelim.

select SOUNDEX('ahmet')   -- Sonuç : A530

 

select SOUNDEX('akmet')   -- Sonuç :  A253


Sonuçları inceleyecek olursak dönen değerlerin 3 karakteri aynı. Bunlar 'A','5' ve '3' farklı olan ise '0' ve '2'. Şimdi iki kelimeyi Difference fonksiyonuna tabi tutalım
 

select DIFFERENCE('ahmet','akmet') -- Sonuç :  3

 

Kısacası DIFFERENCE değeri bize parametre olarak aldığı iki ifadenin ne kadar benzer olduğunu gösteriyor.

SOUNDEX ve DIFFERENCE fonksiyonlarını öğrendiğimize göre şimdi Difference fonksiyonunu kullanarak google tarzı aranan kelime tavsiye eden basit bir arama sayfası yapalım

 

İlk olarak kullanacağımız örnek veritabanını oluşturalım. Kullanacağımız tabloya ait create script ve verileri aşağıdaki gibi olacak.

CREATE Table Siteler

(

      [ID] [int] NULL,

      [SiteAdi] [varchar](100) NULL,

      [Aciklama] [varchar](200) NULL

)

 

ID

SiteAdi

Aciklama

1

yazilimmutafagi

Programlama konudları hakkında güncel makaleler bulunan bir site

2

google

İnternet kullanmayı kullanışlı ve zevkli hale getiren arama motoru

3

bing

Microsoft tarafından google'a karşı rakip olarak çıkarılan arama motoru

4

microsoft

Microsoft şirketine ait resmi web sitesi. Site üzerinden msdn kütüphanesinede erişebilirsiniz

 

Şimdi sırada bu tablo üzerinden arama yapacağımız bir web sayfası yapmak. Bunun için visual studio içinde yeni bir websitesi oluşturup sayfamıza aşağıdaki html kodlarını ekliyoruz.

<div>

        <asp:TextBox ID="ArananKelimeTextBox" runat="server"></asp:TextBox>

        <asp:Button ID="AraButton" runat="server" Text="Arama"

            onclick="AraButton_Click" />

        <p>

            <asp:Label ID="TavsiyeEdilenLabel" Visible="false" runat="server" Text=""></asp:Label></p>

        <asp:GridView ID="SonuclarGridView" runat="server">

        </asp:GridView>

</div>

 

Ardında arama butonuna basınca çalışacak kodları yazalım. İlk olarak arama yapılınca eğer bir sonuç dönerse direk olarak sonuçları gridde göstereceğiz. Eğer arama sonrası herhangi bir sonuç dönmezse difference fonksiyonu ile arama yaparak benzer kelimeyi göstereceğiz. Bunu için aşağıdaki iki metodu yazalım ve bunları Arama butonuna basılınca aşağıdaki gibi çağıralım.

protected void AraButton_Click(object sender, EventArgs e)

{

    int sonucsayisi = AramaYap(ArananKelimeTextBox.Text);

    if (sonucsayisi == 0)

    {

        BenzeriniBul(ArananKelimeTextBox.Text);

        TavsiyeEdilenLabel.Visible = true;

    }

}

 

string conString = "Data Source=.;Initial Catalog=DemoDB;Integrated Security= true";

private void BenzeriniBul(string p)

{

    string sql = "select top 1 SiteAdi from Siteler where DIFFERENCE(SiteAdi,'" + p + "') > = 3";

    SqlCommand command = new SqlCommand(sql, new SqlConnection(conString));

    command.Connection.Open();

    string tavsiyeEdilenKelime = command.ExecuteScalar().ToString();

    if (!String.IsNullOrEmpty(tavsiyeEdilenKelime))

    {

        TavsiyeEdilenLabel.Text = "Bunumu Demek istemiştiniz <strong>" + tavsiyeEdilenKelime + "<strong/>";

    }

    else

    {

        TavsiyeEdilenLabel.Text = "Her hangi bir sonuç bulunamadı";

    }

}

 

private int AramaYap(string p)

{

    string sql = "select * from Siteler where SiteAdi LIKE '%" + p + "%'";

    SqlDataAdapter da = new SqlDataAdapter(sql, conString);

    da.SelectCommand.Connection.Open();

    da.SelectCommand.ExecuteNonQuery();

    DataTable dt = new DataTable();

    da.Fill(dt);

    SonuclarGridView.DataSource = dt;

    SonuclarGridView.DataBind();

    return dt.Rows.Count;

}

 

Oluşturduğumuz sayfada ‘google’ kelimesini aradığımızda aşağıdaki gibi bir sonuç bulur

‘Google’ kelimesinin aksine veritabanımızda bulunmayan ‘doogle’ kelimesini ararsak herhangi bir sonuç dönmeyeceği için bize tavsyede bulunur.
 

Umarım anlattıklarımız işinize yarayacaktır.

Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

Yorum Yapabilmek İçin Üye Girişi Yapmanız Gerekmektedir.

ETİKETLER