αναζητηση με φραση σε πολλα cols

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
jmaz
Δημοσιεύσεις: 20
Εγγραφή: 18 Ιουν 2011 15:51

αναζητηση με φραση σε πολλα cols

Δημοσίευση από jmaz » 18 Ιουν 2011 16:25

Θελω να φτιαξω μια αναζητηση στην οποια ο χρηστης θα μπορει να ψαχνει μια φραση σε συγκεκριμενα cols της db.

εστω οτι εχω μια db με τα εξης cols :
Column -> Value

ID -> 1
Fullname -> κωστας γεωργιου
Category -> αυτοκινητο
Subcategory -> ζαντες
Keywords -> λαστιχο, ζαντα, ροδα, τροχος, μπουλονι
Description -> τα παντα για τους τροχους του αυτοκινητου σας

ID -> 2
Fullname -> γεωργιος κωσταντινου
Category -> αυτοκινητο
Subcategory -> φρενα
Keywords -> φρενα, δισκοφρενα, τακακια, ταμπουρα, δαγκανες
Description -> τα παντα για τα φρενα του αυτοκινητου σας

η αναζητηση θα εχει ενα text input.

η php παιρνει το input και περναει το παρακατω query στην mysql

SELECT * FROM a_table WHERE Fullname LIKE '%".$input."%' OR Category LIKE '%".$input."%' OR Subcategory LIKE '%".$input."%' OR Description LIKE '%".$input."%' OR Keywords LIKE '%".$input."%'

αν ο χρηστης γραψει:
"λαστιχο", θα πρεπει να του βγαλει το id 1
"φρενα", θα πρεπει να του βγαλει το id 2
"αυτοκινητο", θα του βγαλει και τα δυο id

το προβλημα μου ειναι το εξής :

αν ο χρηστης γραψει "δισκοφρενα τακακια", θα του βγαλει το id 2

αν ομως γραψει "τακακια δισκοφρενα" δεν θα βγαλει τιποτα.

εχω σκεφτει 2 λυσεις για αυτο, ομως τι ειναι πιο σωστο;
α) να κανω explode το input και να κανω ενα for-while για καθε στοιχειο του array
β) να βαλω στον table keywords1, keywords2, keywords3, ... keywordsX για καθε μια λεξη

στο α) θα κανει Χ φορες το query (Χ = ποσες λεξεις εχει γραψει ο χρηστης)
ενω στο β) θα πρεπει να κανω το παρακατω query
SELECT * FROM a_table WHERE Fullname LIKE '%".$input."%' OR Category LIKE '%".$input."%' OR Subcategory LIKE '%".$input."%' OR Description LIKE '%".$input."%' OR Keywords1 LIKE '%".$input."%' OR Keywords2 LIKE '%".$input."%' OR Keywords3 LIKE '%".$input."%' ... OR KeywordsX LIKE '%".$input."%'

τα keywords μπορει να ειναι min 8, max 30

Το αποτελεσμα που θελω ειναι οταν εχει μια λεξη να βγαζει ολες τις εγγραφες με αυτη την λεξη, αν εχει δυο+ λεξεις να βγαζει ολες τις εγγραφες που περιεχουν και τις δυο+ λεξεις (ή να τις βγαζει πρωτες)

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

αναζητηση με φραση σε πολλα cols

Δημοσίευση από pimpogio » 18 Ιουν 2011 16:55

η βαση σου ειναι μη normalized και ειναι εντελως προβληματικη..
πριν πας παρακατω κανε normalization ..

επισης για σωστη αναζητηση ξεχνα την mysql θες μηχανη αναζητησης
για να βρισκει ας πουμε τα greeklish tα ανορθόγραφα κτλπ
Τελευταία επεξεργασία από το μέλος pimpogio την 18 Ιουν 2011 17:00, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

αναζητηση με φραση σε πολλα cols

Δημοσίευση από jpk » 18 Ιουν 2011 16:58

Θα σου πω τι κάνω εγώ σε τέτοιες περιπτώσεις και θα χαρώ να ακούσω και άλλες λύσεις καθώς με έχουν απασχολήσει αντίστοιχα προβλήματα (και τώρα τελευταία έχω ακούσει καλές άλλες ιδέες από εδώ, όσο αφορά την δομή των δεδομένων).

Μια ιδέα είναι να φτιάξεις ένα πίνακα keywords (με ID , ΚΕΥWORD) , μοναδικά και τα δύο. Στον πίνακά σου που μας περιέγραψες (ας τον πούμε professionals) να μην υπάρχει το Keywords και έναν πίνακα αντιστοίχισης π.χ. professionals_keywords με (ID,PROFESSIONAL_ID,KEYWORD_ID) με μοναδικό μόνο το ID.
Έτσι με το που παίρνεις τις λέξεις αμέσως ξέρεις αρχικά αν έχεις κάποια και πόσες έχεις και τα ID τους. Στην συνέχεια από τον πίνακα professionals_keywords μαθαίνεις αν και ποια ID από τον professionals αντιστοιχίζονται σε αυτές τις λέξεις και μπορείς να τα κάνεις order με κάποιο count (group by professionals id).

Όλα αυτά μπορείς να τα κάνεις τμηματικά με prepared statements (επειδή είναι prepared το κόστος είναι πραγματικά ελάχιστο) ή σε ένα μεγάλο query με joins (επειδή αν κατάλαβα καλλά εσύ φτιάχνεις την βάση μπορείς να έχεις σωστά κλειδιά εκεί που γίνονται τα joins). Εγώ πάντως για λόγους λογικής ροής επιλέγω συνήθως (όχι πάντα) τα τμηματικά prepared statements.

Όπως σου είπα μόνο μια ιδέα είναι αυτή και περιμένω και εγώ και άλλες καθώς είναι ενδιαφέρον θέμα.
Τελευταία επεξεργασία από το μέλος jpk την 18 Ιουν 2011 17:05, έχει επεξεργασθεί 1 φορά συνολικά.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

αναζητηση με φραση σε πολλα cols

Δημοσίευση από jpk » 18 Ιουν 2011 17:02

pimpogio έγραψε:η βαση σου ειναι μη normalized και ειναι εντελως προβληματικη..
πριν πας παρακατω κανε normalization ..
Βοηθά αυτό σε τίποτα; Αν αυτή είναι η άποψή σου (τονίζω … άποψη) εξήγησέ την περισσότερο, να καταλάβει και αυτός που ρωτάει γιατί έχουμε denormalization και αφού προτείνεις να γίνει normalization πες και μια άποψη πως θα γίνει αυτό.

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

αναζητηση με φραση σε πολλα cols

Δημοσίευση από pimpogio » 18 Ιουν 2011 17:09

jpk έγραψε: Μια ιδέα είναι να φτιάξεις ένα πίνακα keywords (με ID , ΚΕΥWORD) , μοναδικά και τα δύο. Στον πίνακά σου που μας περιέγραψες (ας τον πούμε professionals) να μην υπάρχει το Keywords και έναν πίνακα αντιστοίχισης π.χ. professionals_keywords με (ID,PROFESSIONAL_ID,KEYWORD_ID) με μοναδικό μόνο το ID.
αυτο λεγετε normalization και σκοπο εχει να απαλαξει τη βαση απο διαφορα προβληματα
ειναι ετοιμη μεθοδολογια..

αλλα δεν φτανει μονο αυτη η αλλαγη.. η βαση σου θελει ολη normalization

px san paradeigma
categories(catID,title,description,left_node,right_node)
firstnames(fnID,firstname)
lastnames(lnID,lastname)
names(fnID,lnID)
cat_keywords(catID,kID)
keywords(kID,keyword)

an thes na sindeseis to kathe name me 1 katigoria kane to os eksis
names(cID,fnID,lnID)
me polles
names(nID,fnID,lnID)
names_categories(nID,cID)

fisika me ola ta pkeys/ukeys/fkeys ktlp

kai prosoxi i engine na einai se innodb oxi myisam.. i myisam exei elipsi basikon leitourgion den kanei.
Τελευταία επεξεργασία από το μέλος pimpogio την 18 Ιουν 2011 17:27, έχει επεξεργασθεί 2 φορές συνολικά.

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6236
Εγγραφή: 30 Νοέμ 2004 03:09

αναζητηση με φραση σε πολλα cols

Δημοσίευση από fafos » 18 Ιουν 2011 17:23

fulltext+match kai relevance

pleonekthmata: den endiaferei h seira ton lexeon, katatasei ta apotelesmata symfona me to poses lexeis tairiazoun sta keimena, den endiaferetai gia tonous h kefalaia sta ellhnika (an h vash einai se utf-8 )

meionekthmata: an exeis megalh vash tha travaei zori, stous perissoterous servers thelei oi lexeis na einai 3-4 xarakthres toulaxiston (sta agglika, sta ellhnika h utf8 ta vlepei dipla opote to "ta" einai 4 xarakthres kai mporei na to psaksei, mporeis na rythmiseis ton server an exeis prosvash gia na anazhta kai me ligoterous xarakthres), thelei oposdhpote oloklhrh thn lexh (p.x. to faf den tha sou gyrisei pote apotelesma gia to fafos), kapoies koines agglikes lexeis den tis anazhta
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

αναζητηση με φραση σε πολλα cols

Δημοσίευση από pimpogio » 18 Ιουν 2011 17:34

to fulltext den paizei se innodb paizei se myisam
kai i myisam engine gia ti douleia pou to thelei apla den kanei...

i oracle arxise na vlepei tin mysql san antipalo meta poy evale tin innodb engine oso eitane me myisam oute pou tin ipologize san rdbms gi auto kai tin pire meta..

tora to oti joomla / wordpress exoune myisam den paei na pei oti einai kai kalo..
idika ama deis ti vasi tou wordpress einai tragiki..

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

αναζητηση με φραση σε πολλα cols

Δημοσίευση από Apostolis_38 » 18 Ιουν 2011 17:36

Το καλύτερο που θα μπορούσες να κάνεις, κατά τη γνώμη μου, είναι να "οδηγείς" τον χρήστη στο που θα ψάξει τι.
Παρουσίασε του ένα drop down menu όπου αναγκαστικά θα επιλέγει αν θέλει να ψάξει στο category ή στο subcategory ή στο keywords.
Θα μπορούσες να το κάνεις και σταδιακά. Δηλαδή πρώτα να επιλέγει αυτοκίνητο ή μηχανή ή σκάφος κ.λ.π. κ.λ.π., μετά ζάντες ή κινητήρας ή φρένα και πάει λέγοντας.
Η γενική αναζήτηση (σε στυλ google) όπως και να 'χει θα ζορίζει τη βάση. Ειδικά όσο οι εγγραφές θα αυξάνονται.

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

αναζητηση με φραση σε πολλα cols

Δημοσίευση από pimpogio » 18 Ιουν 2011 17:44

οι live αναζητησεις φυσικα και θα τελιωσουνε το server
αμα εχεις πολλους επισκεπτες θελεις caching
για να το ξεπερασεις αυτο..

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

αναζητηση με φραση σε πολλα cols

Δημοσίευση από Apostolis_38 » 18 Ιουν 2011 17:46

pimpogio έγραψε:i oracle arxise na vlepei tin mysql san antipalo meta poy evale tin innodb engine oso eitane me myisam oute pou tin ipologize san rdbms gi auto kai tin pire meta..
H MySQL άρχισε να αναπτύσει την InnoDB γύρω στο 2001. Η Oracle την αγόρασε το 09.
Δεν ήταν αυτός ο λόγος που "φοβήθηκε" την MySQL.
Απλώς η Oracle έχει μια "ψύχωση" να προσπαθεί να αγοράσει ότι καλό κυκλοφορεί σε open source.
Είτε της βγαίνει σε καλό (MySQL) είτε σε κακό (Open Office το οποίο τελικά δώρισε στο Apache Foundation).

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6236
Εγγραφή: 30 Νοέμ 2004 03:09

αναζητηση με φραση σε πολλα cols

Δημοσίευση από fafos » 18 Ιουν 2011 17:47

pimpogio έγραψε:οι live αναζητησεις φυσικα και θα τελιωσουνε το server
αμα εχεις πολλους επισκεπτες θελεις caching
για να το ξεπερασεις αυτο..
edo otan kaneis anazhthsh termatizeis ton server?
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

αναζητηση με φραση σε πολλα cols

Δημοσίευση από pimpogio » 18 Ιουν 2011 17:48

που εδω ?
--
χωρις innodb η mysql δεν ειναι πραγματικη σχεσιακη βαση...
αυτο της δινει αξια..
η innodb ειναι ολα τα φραγκα και απο εκει χανει πελατες η oracle..

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6236
Εγγραφή: 30 Νοέμ 2004 03:09

αναζητηση με φραση σε πολλα cols

Δημοσίευση από fafos » 18 Ιουν 2011 17:55

pimpogio έγραψε:που εδω ?
sta pathsia..
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

αναζητηση με φραση σε πολλα cols

Δημοσίευση από Apostolis_38 » 18 Ιουν 2011 17:59

pimpogio έγραψε: χωρις innodb η mysql δεν ειναι πραγματικη σχεσιακη βαση...
αυτο της δινει αξια..
η innodb ειναι ολα τα φραγκα και απο εκει χανει πελατες η oracle..
Δεν είναι το κατάλληλο topic να το συζητήσουμε αυτό αλλά είσαι και στα δύο μισό μέτρο οφσάϊντ.
Και κυρίως μην απαξιώνεις οτι δεν αρέσει σε σένα.
Δεν είναι μόνο InnoDB οι βάσεις...

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

αναζητηση με φραση σε πολλα cols

Δημοσίευση από pimpogio » 18 Ιουν 2011 18:04

an enoeis sto forum as pane 200 xristes mazi na kanoune real time anazitiseis kai tha doume ti tha pathei o server...

eksalou ola ta forums auta exoune prostasia kai den se afinoune na kaneis sinexeia anazitiseis akrivos gia na mhn termatisoune...

se shared hosting ama exeis polous xristes na kanoune real time anazitisi paei..

alla amfivalo edo ama pano apo 5 xristes mazi kanoune tautoxroni anazitisi.

den termatizei sti 1 anazitisi stis polles tautoxrones
termatizei.
An den exei kai indexes ekei ton troei i marmargka

oso gia tin myisam den exei basika pragmata opos foreign keys/transactions
einai mia anavathmismeni apothiki dedomenon
den mporei oute kata dianoia na sigkrithei me tin innodb engine..
Τελευταία επεξεργασία από το μέλος pimpogio την 18 Ιουν 2011 18:07, έχει επεξεργασθεί 1 φορά συνολικά.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης