αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

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

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

Απάντηση
txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από txc » 19 Νοέμ 2015 08:20

Καλημέρα,
έχω ένα πρόβλημα και ζητάω ιδέες για το πως θα το διαχειριστώ,
σε μια βάση υπάρχουν περασμένα προϊόντα από ένα λογιστικό πρόγραμμα το οποίο έχει θέμα με τα ελληνικά και σε πολλά προϊόντα το ελληνικό ο είναι περασμένο σαν αγγλικό ο, αντίστοιχα και με το α.
τα προϊόντα είναι πάρα πολλά οπότε δεν μπορώ να ξέρω τι άλλα προβλήματα μπορεί να υπάρχουν σε άλλα γράμματα

το θέμα είναι ότι θέλω να φτιάξω μια αναζήτηση σε php που να ψάχνει για τα προϊόντα, οπότε καταλαβαίνετε ότι είναι πρόβλημα γιατί ο χρήστης αναζητά προϊόντα με ελληνικά γράμματα και δε βρίσκει τίποτα.

ξεκίνησα με το convert των γραμμάτων από α σε a π.χ. αλλά μάλλον δε λύνει όλα τα προβλήματά μου αυτό γιατί υπάρχει πιθανότητα να υπάρχουν λέξεις και με α κανονικό.

πως θα μπορούσα να το διαχειριστώ?

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από gvre » 19 Νοέμ 2015 09:52

Τί βάση χρησιμοποιείς;

thanatoz
Δημοσιεύσεις: 31
Εγγραφή: 25 Οκτ 2015 19:46

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από thanatoz » 19 Νοέμ 2015 10:36

κανε mass replace στην βαση σου ολα τα α σε a η το αντριστροφο και καθαρισες.

txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από txc » 19 Νοέμ 2015 10:49

βάση mysql

το σκέφτηκα για μαζικό replace αλλά έτσι φοβάμαι μη χάσω εγγραφές καθώς και όταν ο χρήστης κάνει αναζήτηση και γράφει το ελληνικό α τότε θα πρέπει να κάνω και convert τη λέξη αναζήτησης α ->a κλπ
και φαντάσου ότι σε οποιοδήποτε σημείο του site εμφανίζω το προϊόν θα πρέπει να το δείχνω σωστά στο χρήστη

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από gvre » 19 Νοέμ 2015 11:22

Για να είναι αποτελεσματική η αναζήτηση θα πρέπει να παίξεις με fulltext. Ποια έκδοση mysql έχεις και τί storage engine (myisam, innodb) στον πίνακα με τα προϊόντα;
Επίσης, στο πεδίο που θα κάνεις την αναζήτηση έχει μόνο ελληνικά ή υπάρχει περίπτωση να έχει και αγγλικά;

txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από txc » 19 Νοέμ 2015 17:16

Database client version: libmysql - 5.0.77 και MyISAM storage engine

ναι μια λέξη μπορεί έχει μικτά ελληνικά και αγγλικά και άλλη μπορεί να έχει μόνο αγγλικά ή μόνο ελληνικά οπότε και μπερδεύει το πράγμα

τι εννοείς να παίξω με fulltext?

thanatoz
Δημοσιεύσεις: 31
Εγγραφή: 25 Οκτ 2015 19:46

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από thanatoz » 19 Νοέμ 2015 18:36

Φτιαξε αλλο ενα πεδιο σε καθε record και κανε ινσερτ το πεδιο Α να υπαχρει και το πεδιο Β
Αν βρισκεις Ελληνικο γραμμα στο Search Word θα ψαχνεις το πεδιο Α αν οχι το Πεδιο Β και λυθηκε το προβλημα σου παλι.

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από gvre » 19 Νοέμ 2015 19:06

Αρχικά, φτιάξε έναν νέο πίνακα με πεδία id, title για να κάνεις εκεί τις δοκιμές σου. Αν προσθέσεις πεδίο στον πίνακα που έχεις τώρα ίσως να μη δουλεύει μετά το λογιστικό πρόγραμμα (μπορείς να το δοκιμάσεις κάποια στιγμή). Μετά, μπορείς να χρησιμοποιήσεις τον παρακάτω κώδικα, με ό,τι παραλλαγές χρειαστεί, για να κάνεις normalize τις εγγραφές. Όταν τελειώσεις με αυτά, μπορείς να φτιάξεις ένα fulltext index και να κάνεις την αναζήτηση.
Ιδανικά, η διαδικασία αυτή θα έπρεπε να γίνεται στη βάση και να τρέχει αυτόματα με κάποιο trigger. Μπορείς να ψάξεις αν γίνεται και να το κάνεις.

Κώδικας: Επιλογή όλων

function isGreekWord($word)
{
    if (!preg_match_all('#(\p{Greek})#u', $word, $m))
        return false;
    $grTotal = count($m[0]);
    $enTotal = strlen(iconv('utf-8', 'iso8859-7', $word)) - $grTotal;

    return $grTotal >= $enTotal;
}

$en = array('a', 'e', 'k');
$gr = array('α', 'ε', 'κ');
$s = 'kaλημeρa κοσμe hεllo world'; // string from database

$tokens = explode(' ', $s);
foreach($tokens as &$token) {
    if (isGreekWord($token))
        $token = str_replace($en, $gr, $token);
    else
        $token = str_replace($gr, $en, $token);
}
$s = implode(' ', $tokens);
echo $s;

txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από txc » 19 Νοέμ 2015 21:46

η λογική είναι ότι κάνει convert μόνο τις Ελληνικές λέξεις?
υποθέτω ότι όταν υπάρχουν μόνο λατινικά γράμματα δεν κάνει κάποιο convert

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από gvre » 19 Νοέμ 2015 21:55

Σε κάθε λέξη, μετράει τους ελληνικούς και λατινικούς χαρακτήρες. Αν οι ελληνικοί είναι >= από τους λατινικούς, θεωρεί ότι η λέξη είναι ελληνική και έχει κάποιους λατινικούς χαρακτήρες, οπότε κάνει replace τους λατινικούς σε ελληνικούς.
πχ. kaλημeρa -> καλημερα

Αν οι λατινικοί είναι περισσότεροι, κάνει replace τους ελληνικούς με τους αντίστοιχους λατινικούς.
πχ. hεllo -> hello

Εννοείται ότι πρέπει να βάλεις τους χαρακτήρες που σε ενδιαφέρουν στα arrays $en, $gr.
Το παράδειγμα είναι usable. Τρέξε το να δεις πώς λειτουργεί.

txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από txc » 19 Νοέμ 2015 22:12

και αν μια λέξη έχει μόνο ένα λατινικό γράμμα? π.χ. γaλα

εκεί δε θα κάνει τίποτα υποθέτω

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από gvre » 19 Νοέμ 2015 22:15

Θα το διορθώσει σε γαλα. Κάνε δοκιμές με τον κώδικα που έγραψα και αν χρειάζεται κάτι, άλλαξέ το κατάλληλα.

txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από txc » 19 Νοέμ 2015 22:35

κοίτα τι πρόβλημα υπάρχει, αν στη βάση το σωστό είναι γάλα και γράψει ο χρήστης αναζήτηση γάλα, δηλαδή αν στη βάση δεν υπάρχει προβληματικός χαρακτήρας το αλλάζει σε γaλa και δε βρίσκει τίποτα

το θέμα είναι ότι είναι ψιλό άναρχα στη βάση, δηλαδή μια λέξη μπορεί να έχει λατινικο a και άλλη ελληνικό α

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από gvre » 19 Νοέμ 2015 22:52

Ο κώδικας που έγραψα δεν είναι για να κάνεις την αναζήτηση, αλλά για να διορθώσεις τις λέξεις που είναι στη βάση. Όταν το κάνεις αυτό, μπορείς να χρησιμοποιήσεις fulltext για τις αναζητήσεις σου.
Επίσης, τη λέξη γαλα την αφήνει ως έχει, δεν την αλλάζει σε γaλa. Μπορείς να το δεις και εδώ http://ideone.com/4kcNOw

txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

αναζήτηση σε λέξεις μεταξύ αγγλικών και ελληνικών

Δημοσίευση από txc » 19 Νοέμ 2015 22:57

κατάλαβα ευχαριστώ

Απάντηση

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

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

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