none
Sahibinden.com, gittigidiyor.com, emlak portalları gibi sitelerin detaylı arama sorgulama teknikleri RRS feed

  • Soru

  • Merhaba arkadaşlar C# Asp.net ile mssql veri tabanı kullanıyorum. Başlıktaki gibi detaylı arama sistemini yapmam gerekiyor. Örneğin gittigidiyor yada hepsiburada hatta sahibinden.com da detaylı arama gerçekleştiriliyor. Otomobil seçiyorsunuz marka model, filan derken en son klima , airbag, kol dayama, sunroof filan biton içerik var. Yada ev diyorsunuz oda tiplerinden, satılık kiralık filan deniz manzaralı ulaşım filan herşey var. Seçiyorsunuz ara diyorsunuz o kriterlere göre ilan getiriyor yada ürün. Bu tarz sistemlerde nasıl sorgular yaparız? Msql ve asp.net tarafında nasıl yaparız mantığını söyleseniz bile araştırırım. Yada nasıl araştıracağım? Binlerce if döngüsü mü kuracağım bu boşsa şunu yap şu doluysa bunu yap vs.. Yardım edin lütfen!

    Gökhan Atılgan

    28 Ocak 2015 Çarşamba 18:33

Tüm Yanıtlar

  • Daha önce Link'de benzer bir soru sormuştum çetin bey ve Önay beyin değerli açıklamaları mevcut istersen bir incele;Kolay Gelsin;


    28 Ocak 2015 Çarşamba 18:45
  • Hocam doğru mantık fakat, ben daha dinamik olsun istiyorum. Binlerce sorgu gelebilir. Mesela şu tarz yapabiliyorum. İç içe iflerle textbox dropdownlist ve checkbox ları kontrol ettirip onları sorguya ekletebiliyorum. Fakat bu code behind da o kadar büyük bir yük ki, çok fazla zorluyor. Kaldı ki dinamik değil. Özellikle checkbox lar. biraz araştırınca filtreleme olarak birkaç sonuç buldum orada da güzel anlatmışlar. Ancak bahsettiğim gibi, kişi hepsini boş döndürebilir özellikle querystringe o kadar veri taşıtırsam ben bile sapıtabilirim. :)

    Gökhan Atılgan

    28 Ocak 2015 Çarşamba 19:39
  • Sanırım Tam olarak incelenme din Orada Soner beyin verdiği link de var ;
    28 Ocak 2015 Çarşamba 19:50
  • Cevap soruda gizlidir belki "daha dinamik". Dinamik dillere bak.  Bir de gittigidiyor, sahibinden gibi yerler bu is icin mssql kullanmiyor diye biliyorum. PostgreSQL, MongoDb gibi databaseleri incelemende fayda var (sonunda atacaklar beni MS forumlarindan). 
    28 Ocak 2015 Çarşamba 20:29
  • Search hashtagını görünce atladım direk :) Eğer sen bir arama yapıcaksan bu aramanın yüzlerce farklı tablodan bilgiler olabileceğini biliyoruz. Bu yüzden bu gibi durumda ilişkisel databaseler üzün süre kurtarsada bi süre sonra patates oluyor. Ya da ilişkisel olmayan farklı çözümler ile sonuçlara gidiliyor. Azure Search ve Elastic Search olayı çok iyi ele alıyorlar. Senin arama yapacağın alan(database) tamamen farklı oluyor. Yani sen bir sql serve kullan oracle kullan mongodb kullan farketmez. Arama alanına eklenmesi gereken her alanı indeksliyorsun ve bu şekilde müthiş bir hıza ulaşıyorsun. Search olayı tamamen ayrı bir katmanda koşuyor. Üstüne sana sağladığı facedlar(otomobil aratınca marka model gelmesi bu oluyor) olsun suggestionslar(yazdığın otomobil ismini tamamlaması yanlış ise düzeltmesi gibi) olsun ekstra kolaylık sağlıyor.

    Zaten verdiğin örneklerde özellikle arama kısmında ilişkisel bir database olma ihtimalini düşünemiyorum. İkiside NoSql bir çözüm ile buna hallettiklerini biliyorum. Eğer olay performansa gelicekse ilişkisel databaseleri güzel kullanman gerekiyor. Senaryona göre farklı çözümlere yönelmen ya da farklı  çözümlerle entegre etmen gerekiyor. Çünkü o büyüklüklerde ki sitelerin hiçbiri .net + sql server olmuyor. .net + sql + elastic search ya da .net + sql + nosql + azure search gibi birden fazla çözümleri entegre ederek gidiliyor. Tabi bu şekilde bir sistemi tasarlayıp hayata geçirmekte kolay birşey değil.

    Sana önerim eğer yapını nosql e çevirebiliceksen MongoDB kullanman. Yani hız sorununu bir nevi aşarsın ama yapın buna ne kadar müsait onu düşünmen gerekiyor.

    Ekleme1: Bu linkte stackoverflow.com'ın alt yapı sistemi yer alıyor. İncelediğinde bütün yapın nasıl ayrıldığını görürsünüz. Verdiğin örneklerde de bu şekilde çözümler getiriliyor. Yani yazılım ile donanımı ayrı düşünülemez.



    • Düzenleyen Berdann 29 Ocak 2015 Perşembe 08:30
    28 Ocak 2015 Çarşamba 21:41
  • Güzel açıklamalarınız için teşekkür ederim.

    Şimdi bir emlak sitesi yapıyoruz diyelim. Dinamik olacağı için mssql veri tabanına da güzelce birkaç tablo yerleştirelim. Mesela, bir tablom olsun onda da kiralı mı satılık mı diye iki verim olsun. Arayacak olan kişi kiralık yada satılık arayacak. Bu tamam, sonra bi tablo daha tbl_tip olsun bunda da apartman, daire, yazlık, depo, arazi, müstakil diye gitsin. Sonra bi tablom daha olsun, onda da tbl_ozellik olsun. Orda misal havuzlu, bahçeli, betonarme, ısınma tipi soba, filan biton olay. falan filan yazsn. şimdi ben mantıken asp.net e yıkarsam dinamik olmaz. Yani bisürü özellik filan var. Permutasyon gibi if else kurarsam batarım. Emlak tipi seçildiyse if in icine gir sonra bak bakim fiyat aralığı seçildi mi falan filan. yeni birşey ekleneceğinde koddan değiştirmek dinamik olmuyor. Diğer bir yol, eskiden (vs 2010) membership vardı. Microsoft kendi oluşturuyordu tabloları filan. Orda virgül ile ayırıyordu. Acaba diyorum, bende aynı sistemi yapsam daha iyi olmaz mı? özellik tablomun 330. id sinde bahçeli yazsın misal. 1 nolu id de Okula yakın olsun. 40 nolu idli de Durağa yakın olsun mesela. Ben tabloya 330,1,40 diye yazsam sonra ordan çeksem nasıl olur aklıma en ii fikir bu geldi. Daha dinamik duruyor. Her eve yada apt. bunlar uygulanabilir rahatlıkla.


    Gökhan Atılgan

    1 Şubat 2015 Pazar 13:26
  • Hadi benim yazdığımı geçtim Çetin Hoca'nın yazdığını okudun mu? Sql Server'a dinamik diyorsun o zaman bütün veritabanları dinamiktir. Yani sizin dinamikten kastınız ne bir kere orada sorun yaşıyorsunuz? Benim dinamik kelimesinden anladığım: Veritabanında tablolarda kolon yapısına bağlı kalmadan istediğim gibi kolon açabilmemdir. Yani kiralik iki ev düşünün. Bunlar aynı tabloda tutuluyor. Biri 2+1 havuzlu otoparklı apartman dairesi Öteki: 3+1 bahçıvanı var asansör var tadilatı yeni yapılmış. İkisinde bulunan bilgiler sadece bu kadar yani ikisinde de farklı alanlar var. Bunu sağlıyacak tek şey nosql veritabanıdır. Ama nosql veritabanlarının mantığını araştırmadan direk yazmışsınız. Verdiğin örnekleri düşün yazdığın şeyi bir düşün arasında ne kadar mantıksızlık var.

    Eskide membership vardı dediğin şey hala var ama bu olayın onla ilgisi yok.

    Özetle: Verdiğin örneklere bakarak cidden düzgün bir yapı kuracağını düşünmüştüm ben ama öle olmadığı gözüküyor. Söylediğin tablo yapısı ile bunu yaparsın. Ama tbl_özellik dediğin tabloda 60'a yakın kolon olur ve çoğu satır için bunların %70'i boş olur. Arama olayına gelicek olursakda yine benim yazdıklarımı okumadığın için if else ile yapmaktan başka bir çaren kalmıyor onda da performansın çok iç açıcı olmayacağı kesin.

    2 Şubat 2015 Pazartesi 07:05
  • Zaten bu konuda çok bilgim olmadığı için soruyu sordum. Nosql pek anlamıyorum. Dinamik deyince evet tablo açmak geliyormuş sizin aklınıza, ama dinamik deyince biraz saf kaldım ben sanırım. Ben dinamik derken, asp.net e otomatik gelmesi if else ile uğraşmadan işi sql de bitirmek, yükü oraya atmak gibi geliyor. Orayı okudum ama pek anlamadım. K. bakmayın sizin gibi prof değilim.

    Gökhan Atılgan

    2 Şubat 2015 Pazartesi 18:07
  • Sorun nereden kaynaklaniyor basit sekilde anlatmaya calisayim:

    Yil: 199X - Cep teleonlari yeni cikmis, sadece 1-2 yil gecmis, ozelliklerini listelesen topu topu birkac tane:

    Pil omru, Konusma suresi, Agirligi, En, Boy.

    Aradan sadece 1-2 yil geciyor ve bir suru yeni ozellik gelmeye basliyor:

    Wifi, Bluetooth, cift GSM, ekranlar, touch ....

    Klasik SQL yaklasimiyla bunlara yeni kolonlar acmak, hem yazilimcinin hem de SQL DBA'in kabusu. Kolonlari acmak filan bir sey degil, arayuzleri de her sene degistirmek gerekir.

    SQL uzerinden gidersen, bir cozum (hic bir zaman tatmin edici olmayan) yan yana bir suru kolon ekleyecegine, propertyBag taklidi yapan bir kac sutunlu bir tablo yapmak:

    PropertyID, OwnerID, PropertyValue

    Owner bir Emlak olabilir, araba, cep telefonu, her ne ise. PropertyValue ozelligin degerini tutar.

    Bir baska tabloda TypeID, PropertyId, PropertyName, DefaultValue olabilir. TypeId araba, emlak, cep tel. ... tutar.

    Tabii bu boyle surer gider :) SQL databaseler ile bu is cok sancili. NoSQL, dokuman database'de ise yeni alan filan eklenmesine gerek yok. Saklanan KVP dokumanlar.

    • Yanıt Olarak İşaretleyen _DungeoN_ 3 Şubat 2015 Salı 08:34
    • Yanıt İşaretini Geri Alan _DungeoN_ 3 Şubat 2015 Salı 08:34
    2 Şubat 2015 Pazartesi 18:33
  • Mükemmel anlatımınız için çok teşekkür ederim. Çetin Bey acaba sağlam güzel bir kaynak öneriniz var mı sizin gibi tane tane anlatan?

    Gökhan Atılgan

    3 Şubat 2015 Salı 08:35
  • Ne yazik ki tek belli kaynak onerim yok. Herhalde temel olarak kullandigim databaselerin online dokumanlarindan yararlaniyorum ben de + degisik databaseleri gercek hayatta kullanip sorunlarini yasayarak.

    3 Şubat 2015 Salı 11:48
  • Merhaba İlk önce mantık şu şekilde ilanlar tablosunu oluşturdukdan sonra kat1 kat2 vs diye tabloları oluşturuyorsun en az 6 kategori alacak şekilde daha sonra moduller tablosu oluşturup içerisine modulturu modultablosu gibi tablolar açıyorsun buraya ilkili kategoriye ekleyeceğin modulleri ekliyorsun ama dikkat etmen gereken konu modul türü 1-2 yapıyorsun  Text alanı 2 li  2nci tür ise çoklu seçim 

    Texk alanı şu modul için gerekli Tur 1 = Fiyat , Metrekare, Kilometre gibimodul ekleyebilmen için
    Çoklu seçim checkbox ise  oda sayısı, banyo sayısı gibi modulleri eklemen için

    birde moduller tablosuna gizli ve aramamenusu sutunları eklemen gerek sol moduller listesinde gözükmesini istemediğin modulü gizli yaparsın arama listesi sonuç sıralamasında gözükmesini istediğin sutunuda aramamenusu 1 yaparsın bu şekilde Fiyat, Km, Tarih, Konum gibi sıralamış olursun sutunları tamamen dinamik 

    şimdi işin asıl kısmı moduliliskileri tablosu oluşturarak misal Emlak > Konut kategorisine katid= 2 olan kategoriye modulleri ekleyelim

    Tablo : moduliliskileri
    ------------------

    id	kid	mid	sira
    
    
    
    1	2	1	1
    
    
    
    2	2	2	2
    
    
    
    3	50	1	3
    
    
    
    5	2	3	4
    
    
    
    7	2	5	5
    
    
    
    8	50	6	1
    
    
    
    9	2	7	
    


    bu şekilde modulleri istediğimiz kategoriye ilişkilendiriyoruz 

    en önemli arama sorgusunda modullerin tablolarını dinamik sorgunun içine ekleyebilmek bunuda Session ile yapabilirsin ben o şekilde yapmıştım 

    kategorideki modül tablolarını

    Tablo1
    tablo2
    tablo3 
    şeklinde session atıp 
    sorgu kodunun içerisine şu şekilde yerleştirdim


    if session("modul1") = "1" then
    	if session("modul1turu") = "1" then
    	if guvenlik(Request.querystring(""&session("modul1tablosu")&"")) <> "" then
    	SQL1 = SQL1 + "AND ilanlar."& session("modul1tablosu") &" In ("& guvenlik(Request.querystring(""&session("modul1tablosu")&"")) &") "
    	end if
    	end if
    	if session("modul1turu") = "3" then
    	veri1 = guvenlik(Request.querystring(""&session("modul1tablosu")&"_min"))
    	veri2 = guvenlik(Request.querystring(""&session("modul1tablosu")&"_max"))
    	if veri1 <> "" then
    	SQL1 = SQL1 + "AND ilanlar."& session("modul1tablosu") &" > '"& veri1 - 1 &"' "
    	end if
    	if veri2 <> "" then
    	SQL1 = SQL1 + "AND ilanlar."& session("modul1tablosu") &" < '"& veri2 + 1 &"' "
    	end if
    	end if
    	end if


    arama sorgu mantığını session ile çözebilirsin tabi sayfa kodunun en altında bu sessionları silmeyi unutmassın mantık aşağı yukarı bu takıldığın yer olursa yardımcı olabilirim  ama mantık bu şekilde ilişkilendirme mantığıyla yaparsan anca bu şekilde altından kalkabilirsin

    5 Mart 2017 Pazar 13:32