Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Έχω φτιάξει μια μηχανή αναζήτησης σε php και MySQL (με την LIKE).

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

Υπάρχει κάποιος τρόπος, πχ ακόμα και κάποια εξωτερική υπηρεσία που να βοηθήσει στο να βρεθούν τα σωστά αποτελέσματα; Σκεφτόμουν κάτι σαν υπηρεσία που επιστρέφει ρίζες λέξεων ή τις τάδε λέξεις σε άλλες πτώσεις και χρόνους κτλ, ώστε να μην είναι μόνο νταν ό,τι γράφει ο χρήστης. Μιλάω για Ελληνικά κυρίως και δευτερευόντως για Αγγλικά.

Γενικά ψάχνομαι να βελτιώσω τη μηχανή σε αυτόν τον τομέα.

Επεξ/σία από philos
Δημοσ. (επεξεργασμένο)

Η php έχει επίσης αρκετές συναρτήσεις που βοηθάνε

https://www.php.net/manual/en/function.levenshtein.php The Levenshtein distance is defined as the minimal number of characters you have to replace, insert or delete to transform str1 into str2.

https://www.php.net/manual/en/function.soundex.php  Soundex keys have the property that words pronounced similarly produce the same soundex key, and can thus be used to simplify searches in databases where you know the pronunciation but not the spelling.

https://www.php.net/manual/en/function.metaphone.php Similar to soundex() metaphone creates the same key for similar sounding words. It's more accurate than soundex() as it knows the basic rules of English pronunciation.

https://www.php.net/manual/en/function.similar-text.php    This calculates the similarity between two strings as described in Programming Classics: Implementing the World's Best Algorithms by Oliver (ISBN 0-131-00413-1).

Μπορείς να συνδυάσεις τα παραπάνω.

Στην db καλό ίσως θα ήταν να κάνεις indexing https://www.w3schools.com/sql/sql_create_index.asp

Τα regexes έχουν πολύ μεγαλύτερη ευελιξία από το LIKE θα πρέπει όμως να παράγεις εσύ το regex με βάση τη λέξη και αυτό μπορεί να είναι περίπλόκο.

Επεξ/σία από k33theod
  • Like 1
  • 5 μήνες μετά...
Δημοσ.
Στις 9/11/2019 στις 12:24 ΜΜ, k33theod είπε

Η php έχει επίσης αρκετές συναρτήσεις που βοηθάνε

https://www.php.net/manual/en/function.levenshtein.php The Levenshtein distance is defined as the minimal number of characters you have to replace, insert or delete to transform str1 into str2.

https://www.php.net/manual/en/function.soundex.php  Soundex keys have the property that words pronounced similarly produce the same soundex key, and can thus be used to simplify searches in databases where you know the pronunciation but not the spelling.

https://www.php.net/manual/en/function.metaphone.php Similar to soundex() metaphone creates the same key for similar sounding words. It's more accurate than soundex() as it knows the basic rules of English pronunciation.

https://www.php.net/manual/en/function.similar-text.php    This calculates the similarity between two strings as described in Programming Classics: Implementing the World's Best Algorithms by Oliver (ISBN 0-131-00413-1).

Μπορείς να συνδυάσεις τα παραπάνω.

Στην db καλό ίσως θα ήταν να κάνεις indexing https://www.w3schools.com/sql/sql_create_index.asp

Τα regexes έχουν πολύ μεγαλύτερη ευελιξία από το LIKE θα πρέπει όμως να παράγεις εσύ το regex με βάση τη λέξη και αυτό μπορεί να είναι περίπλόκο.

Καλησπέρα φίλε @k33theod. Σχετικά με τις παραπάνω συναρτήσεις πλην της similar-text που ομολογώ πως δεν την είχα προσέξει, τις έχεις χρησιμοποιήσει και αν ναί, τις έχεις συνδυάσει κιόλας? 
Η ερώτηση μου προέχεται από την εμπειρία μου στην χρήση τους σε MySQL με FULLTEXT INDEX. Για ένα μεγαλο διάστημα έκανα και συνδυασμό των levenshtein και metaphone.

Δημοσ. (επεξεργασμένο)
Στις 12/4/2020 στις 10:43 ΜΜ, nemesis345 είπε

Καλησπέρα φίλε @k33theod. Σχετικά με τις παραπάνω συναρτήσεις πλην της similar-text που ομολογώ πως δεν την είχα προσέξει, τις έχεις χρησιμοποιήσει και αν ναί, τις έχεις συνδυάσει κιόλας? 
Η ερώτηση μου προέχεται από την εμπειρία μου στην χρήση τους σε MySQL με FULLTEXT INDEX. Για ένα μεγαλο διάστημα έκανα και συνδυασμό των levenshtein και metaphone.

Όχι δυστηχώς, οταν χρειάζομαι string matching ή κάτι τέτοιο το κάνω συνήθως με regex. Είχα κάνει ένα μικρό script/παράδειγμα πως μπορούσε ο @philos  να τις χρησιμοποιήσει αλλά δεν χρειάστηκε και δεν το πόσταρα και τώρα δεν ξέρω που είναι.

Χαίρομαι όμως που δεν προτιμούν όλοι τα έτοιμα και κάνουν κάτι δικό τους. Όπως βλέπω και από το site σου χρησιμοποιείς απλά πράγματα.  👍

Επεξ/σία από k33theod
Δημοσ.

Καλά το site μου έχει μείνει σε πολύ πίσω και χρειάζεται μια σοβαρή ανανέωση, αλλά προς το παρόν τρέχω άλλα project οπότε μένει δυστυχώς πίσω.
Σχετικά πάντως με την υλοποίηση, προτιμώ τον custom κώδικά.
Μέχρι στιγμής δεν έχω θέματα, και αν ακολουθείς και τα όποια documentation υπάρχουν πάντα βγαίνει δουλειά. Στο σιτε μου πάντως μέσα υπάρχει η αναφορά στο έργο που χρησιμοποιώ τα παραπάνω. Το elastic πάντως το κοιτούσα λίγο στην αρχή, αλλά μιλάμε πριν περίπου 10 χρόνια, δεν με κάλυβε αλλά δεν μπορώ να θυμιθώ και τον λόγο! 

Less is more!

Δημοσ.

Να πω και εγώ πως συμφωνώ με τους παραπάνω που πρότειναν την elasticsearch. Μια τέτοια μηχανή είναι μονόδρομος για σωστή και γρήγορη αναζήτηση γλώσσας. Εδώ είναι και οι ανταγωνιστές της elasticsearch:

Apache Solr
Lucene
Sphinx
κλπ...

Προσοχή, γιατί κάποιες μηχανές θέλουν 64GB μνήμη για να τρέξουν, μπορεί να είναι πολλά για PC στο σπίτι αλλά όταν ένα σερβεράκι z15 έχει μέχρι και 40TB μνήμη... τα 64GB είναι μια σταγόνα στον ωκεανό.
 

Δημοσ.

Δράττομαι της ευκαιρίας και αναφέρω το εξης. Μετά από σχεδόν 7 χρόνια που είχα κάνει πρόταση για να αλλάξω αρκετά πράγματα σε σχέση με τον σχεδισμό της βάσης αλλά και του τρόπου λειτουργίας της μηχανής αναζήτησης, μου έγινε πρόταση για αλλαγή της δομής της βάσης με την χρήση json data columns και πιθανόν την ενσωμάτωση της Apache Slor για προσέγγιση αναζήτησης Vector Space Model.

Κάθε σχόλιο δεκτό!

55 λεπτά πριν, dovecotDev είπε

Να πω και εγώ πως συμφωνώ με τους παραπάνω που πρότειναν την elasticsearch. Μια τέτοια μηχανή είναι μονόδρομος για σωστή και γρήγορη αναζήτηση γλώσσας....
 

Δεν ξέρω αν είναι απαραίτητα μονόδρομος. Νομίζω πως περισσότερη σημασία έχει το πλήθος των εγγραφών που καλείται να γίνει η αναζήτηση καθώς επίσης και το πόσο μεγάλα σε πλήθος λέξεων φράσεων είναι τα περιεχόμενα των στηλών που κάνεις τα queries.

Δημοσ.

Δεν θα μπω θεωρία της αμπελοφιλοσοφίας, πόσα δεδομένα τι δεδομένα κλπ.

Θεωρώ προφανές ότι ξέρεις τι δεδομένα έχεις και ποιες είναι οι ανάγκες σου.
 

  • Thanks 1
Δημοσ.

@dovecotDev, εννοείτε πως ξέρει ο καθένας τι έχει, τι ανάγκες θέλει να καλύψει κλπ, κλπ και ανάλογα επιλέγει την μέθοδο που του ταιριάζει!

Δημοσ.

Ειναι το elasticsearch καταλληλο εργαλειο για να κανεις αναζητηση σε mysql? Απο οτι διαβαζω ειναι για unstructured data. 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...