• 27-04-2015, 18:12:32
    #1
    Arkadaşlar Merhabalar , Bir Arama SAyfası Yapmaya Çalışıyorum ve Şöyle Bir Sorunum Oluştu , Aranılan Kelimeyi yada Cümlenin Sonucu Alaka Düzeyine Göre Sıralama Ve Alakalı Olan Sonuçları Gösterme Örnek Olarak ;

    Ev Aramasını Yapınca Kereviz Arama Sonucu Çıkıyor ve İd ye Göre Sıraladığımız İçin en başta olabiliyor Bu Sorunu Nasıl Çözebilirim ?

    Nette Araştırdığıma Göre Sort By Relevance Diye Bir Metod Buldum Ama Doğru Düzgün Türkçe Kaynak Yok , Hatta Hiç Yok , Bu Metod Hakkında Herhangi Bir Örnek Verebilirmisiniz ? Yada Nasıl Yapmam Nasıl bir Yol İzlemem Konusunda Yardımcı Olabilirmisiniz ?

    Şimdiden Teşekkür Ederim .
  • 27-04-2015, 19:16:44
    #2
    Full text search kullanmanız gerekiyor hocam aşağıda bir örnek hazırladım, sizin bahseetiğiniz Relevance olayı tam olarak budur score = Relevance

    $aranan1 = "ara";//sadece ara ile eşleşir
    
    $aranan2 = "ara*";//arama, araba, arada vs ilr eşleşir
    
    // birden fazla alanda arama yapıyorsanız başlık en önemlisidir heralde herhangi eşleşmeye 0,4 puan verilebilir
    // içerikte yakın benzerliğe 0,2
    // yine içerikte tam benzeşmeye 0,4 puan vererek sağlıklı sıralamalar alınabilir
    
    select blog.*,
    (((MATCH (blogBaslik) AGAINST ('$aranan1' IN BOOLEAN MODE)) * 0.4) +
    ((MATCH (blogIcerik) AGAINST ('$aranan1' IN BOOLEAN MODE)) * 0.2) +
    ((MATCH (blogIcerik) AGAINST ('$aranan2' IN BOOLEAN MODE)) * 0.4))
     AS score from blog
     where MATCH (blogBaslik, blogIcerik) AGAINST ('$aranan1' IN BOOLEAN MODE) order by score desc
  • 27-04-2015, 20:54:32
    #3
    Teşekkür ederim , bakalım işin içinden çıkabilecekmiyim

    --R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 20:54:32 -->-> Daha önceki mesaj 20:53:18 --

    Peki sıralamayı nasıl yapıcam order by ile yapsam yine aynı aynı hesaba gelecek
  • 27-04-2015, 21:00:52
    #4
    Sıralamayı "order by score desc" şeklinde yapacaksınız "from" öncesinde bize zaten benzeşim oranlarını veriyor biz benzeşim oranlarını, ondalık sayılarla çarparak stuna göre öncelik atıyoruz. Başlıkta bulunan kelime içerikte bulunandan daha değerlidir, "kaz" kelimesi aranırken "kaz", "kazanmak" kelimesinden daha değerlidir.

    $aranan1 = "ara";//sadece ara ile eşleşir

    $aranan2 = "ara*";//arama, araba, arada vs ile eşleşir

    bu iki değişkeni arama formundan gelen kelimeleri parçalayıp yeniden şekillendirerek oluşturmanız gerekiyor.
  • 27-04-2015, 22:37:55
    #5
    Tamamdır birazdan başlıyorum bakalım yapabilecekmiyim , gözümde biraz büyüttüm sanırım

    --R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 22:37:55 -->-> Daha önceki mesaj 21:03:30 --

    Aşağıdaki Şekilde Yazılan Kelimeyi Bölüp arama yaptırıyorum ala like ile yani get ile çektiğim için senin verdiğin şekilde yaptığımda hata ile karşılaşıyorum bunu nasıl ekleyebilirim peki




    if (@$haberid = $_GET["id"]) {
    $kelimeler = explode(" ", $ilanid); 
    $s_array = array(); 
    foreach ($kelimeler as $key => $value) 
    { 
    
    
    $aranan1 = "%$value%"; 
    $aranan2 = "%$value%*";
    $query_Recordset1="SELECT.*, haber left join resimler on (resimler.id = haber.id) (((MATCH (haber.aciklama) AGAINST ('$aranan1' IN BOOLEAN MODE)) * 0.4) +
    ((MATCH (haber.tipi) AGAINST ('$aranan1' IN BOOLEAN MODE)) * 0.2) +
    ((MATCH (haber.durum) AGAINST ('$aranan2' IN BOOLEAN MODE)) * 0.4))+
    ((MATCH (haber.baslik) AGAINST ('$aranan2' IN BOOLEAN MODE)) * 0.4))+
    ((MATCH (haber.id) AGAINST ('$aranan2' IN BOOLEAN MODE)) * 0.4)) AS score from haber where MATCH (haber.aciklama, haber.tipi,haber.durum,haber.baslik,haber.id) AGAINST ('$aranan1' IN BOOLEAN MODE) order by score desc";
    
    } 
    $where_str = implode(" or ", $s_array);
    $sql_str = "select * from haber where $where_str"; 
    $sql = mysql_query($sql);
  • 27-04-2015, 23:37:11
    #6
    Alıntı
    foreach ($kelimeler as $key => $value)
    {


    $aranan1 .= "$value ";
    $aranan2 .= "{$value}* ";

    }

    $query_Recordset1="SELECT.*, haber left join resimler on (resimler.id = haber.id) (((MATCH (haber.aciklama) AGAINST ('$aranan1' IN BOOLEAN MODE)) * 0.4) +
    ((MATCH (haber.tipi) AGAINST ('$aranan1' IN BOOLEAN MODE)) * 0.2) +
    ((MATCH (haber.durum) AGAINST ('$aranan2' IN BOOLEAN MODE)) * 0.4))+
    ((MATCH (haber.baslik) AGAINST ('$aranan2' IN BOOLEAN MODE)) * 0.4))+
    ((MATCH (haber.id) AGAINST ('$aranan2' IN BOOLEAN MODE)) * 0.4)) AS score from haber where MATCH (haber.aciklama, haber.tipi,haber.durum,haber.baslik,haber.id) AGAINST ('$aranan1' IN BOOLEAN MODE) order by score desc";
    şu şekil deneyin hocam birde arama yapacanığınız alanları veritanından fulltext search olarak ayarlamanız gerekiyor.
  • 28-04-2015, 10:43:38
    #7
    teşekkürler , Veritabanında text olarak geçiyor çoğu alanlar ama id sütünü var identity olarak artıyor , Bunu değiştirmem mevcut kayıtları ve düzeni bozmaz mı ? Tüm Hepsinde değişiklik yaparsam bozulur gibime geliyor ,