PDA

Pogčedajte punu verziju : REGEXP kod pretrage MySQL baze i šžćč?


martinluter
07. 06. 2011., 03:06
REGEXP '[[:<:]]".$pret."[[:>:]]'

REGEXP u mysql upitu, kada kucam reč "smeštaj" ne pronalazi one upise koji umesto š imaju s, tj. "smestaj", a i obrnuto dok LIKE pronalzi i jedno i drugo.
REGEXP mi se cini da daje preciznije rezultate od LIKE, pa zato sam hteo sa njim da pokusam, ali ova slovca me zezaju.

Da li postoji neko resenje za slovca šćčž kod REGEXP?

mileusna
07. 06. 2011., 13:06
Posted by Alan Ng on November 7 2009 3:17am

I can't believe I'm the first to post this solution, since the pain of MySQL's REGEXP not working with multibyte character sets has been expressed all over the Web for years, I see.

Here's my simple workaround, for a database, server, and current connection that are entirely in UTF-8. Of course this only helps the majority of us developers who are in fact dealing with stored data that could just as well have be expressed in latin1:

SELECT * FROM YourTables WHERE (CONVERT (TextField USING latin1)) REGEXP CONVERT ('YourUTF8RegExp' USING latin1))


Nisam nikad koristio REGEXP za MySQL, ovo gore sam pronašao na prvo guglanje, iz 2009. ne znam da li se u međuvremenu nešto promenilo.

http://www.google.com/search?ie=UTF-8&q=mysql%20REGEXP%20utf8

webarto
07. 06. 2011., 13:57
Meni radi OK...

SELECT *
FROM clanci
WHERE naslov REGEXP 'menadz'

0


SELECT *
FROM clanci
WHERE naslov REGEXP 'menadž'

1

Server version: 5.0.92-community
MySQL charset: UTF-8 Unicode (utf8)
cpsrvd 11.30.0.27
MySQL client version: 4.1.22

mileusna
07. 06. 2011., 14:00
Moguće je da su rešili u novim verzijama. Uporedite verzije koje koristite...

martinluter
07. 06. 2011., 16:22
@webarto, prema tvojim upitima, koliko vidim, ne nalazi nijedan rezultat za menadz, a za menadž pronalazi jedan rezultat.
Meni treba da kad neko pretrazuje menadž, da pronadje i one rezltate gde ima i menadz i obrnuto.
Ne moram bas da koristim REGEXP, ako mozete dajte neke primere upita koje vi koristite.
Ovo sto je Mileusna napisao nije mi bas najjasnije.

MySQL client version: 5.0.22
MySQL charset: UTF-8 Unicode (utf8)
server je neka 5-ica sigurno.

Br@nkoR
07. 06. 2011., 16:48
Možda da odradiš pre upita nešto kao:
$pret = str_replace(array('š', 'ć', 'č', 'ž'), array('[šs]', '[ćc]', '[čc]', '[žz]'), $pret);

webarto
07. 06. 2011., 18:27
E pa to ne možeš nikako znati... Jedino da vidiš ova COLLATE hoće li šta pomoći, ako staviš ASCII...

Br@nkoR
07. 06. 2011., 18:41
Možda da odradiš pre upita nešto kao:
$pret = str_replace(array('š', 'ć', 'č', 'ž'), array('[šs]', '[ćc]', '[čc]', '[žz]'), $pret);
Ne mogu da editujem poruku.
Sada sam testirao, probaj ovako npr:
$pret = str_replace(array('š', 'ć', 'č', 'ž', 's', 'c', 'z'), array('(š|s)', '(ć|c)', '(č|c)', '(ž|z)', '(š|s)', '(c|ć|č)', '(ž|z)'), $pret);

webarto
07. 06. 2011., 19:35
SELECT * FROM pojmovi WHERE MATCH (pojam) AGAINST ('+stednje');

Pogađa i "štednje", je li pretražuješ VARCHAR ili TEXT?

martinluter
07. 06. 2011., 20:47
Ne mogu da editujem poruku.
Sada sam testirao, probaj ovako npr:
$pret = str_replace(array('š', 'ć', 'č', 'ž', 's', 'c', 'z'), array('(š|s)', '(ć|c)', '(č|c)', '(ž|z)', '(š|s)', '(c|ć|č)', '(ž|z)'), $pret);

Br@nko, izgleda da radi sa ovom funkcijom. Probao sam na prostom primeru, videcu kako ce se ponasati kod vecih pretraga.
Hvala puno!

@webarto, pretrazujem i VARCHAR i TEXT.
Ovaj primer koji si mi dao izbacuje gresku

$sm=mysql_query("SELECT *
FROM objekti
MATCH (opis) AGAINST ('+smestaj')");

martinluter
07. 06. 2011., 21:00
Uh, ipak nece ovo Branko.

U orginalu smestaj se zove "APARTMAJI BLAŽIČ".

Kad ukucam da nadje bas tako isto "APARTMAJI BLAŽIČ", pronadje ga, ali kad ukucam "APARTMAJI BLAZIC", ne prondaje nista, bem mu bogce.

Br@nkoR
07. 06. 2011., 21:16
Funkcija str_replace je case sensitive probaj sa funkcijom str_ireplace ili dodaj dodatne karaktere u str_replace:

$pret = str_replace(array('š', 'ć', 'č', 'ž', 's', 'c', 'z','Š', 'Ć', 'Č', 'Ž', 'S', 'C', 'Z'), array('(š|s)', '(ć|c)', '(č|c)', '(ž|z)', '(š|s)', '(c|ć|č)', '(ž|z)','(Š|S)', '(Ć|C)', '(Č|C)', '(Ž|Z)', '(Š|S)', '(C|Ć|Č)', '(Ž|Z)'), $pret);

dinke
07. 06. 2011., 23:03
Izvinjavam se sto kvarim zurku, ali zar ne bi bilo daleko bolje i logicnije za ovo koristiti full text index search(naravno pod uslovom da je MyISAM tabela)?

webarto
07. 06. 2011., 23:07
^ ... @martinluter ne radi ti jer nisi postavio FULLTEXT index na TEXT polje...

ALTER TABLE `objekti` ADD FULLTEXT (`opis`)

mileusna
08. 06. 2011., 00:01
Šta god da koristi, dz == dž samo u Tarzan srpskom tako da nijedno rešenje neće raditi out of the box, mora sam da smisli kako će to da konvertuje jedno u drugo i kada...

ivanhoe
08. 06. 2011., 03:34
@mileusna: zapravo, trebalo bi da radi, posto je to u stvari z i ž, to bi trebalo da baza ume da zameni ako ima dobar collation

martinluter
08. 06. 2011., 10:19
Funkcija str_replace je case sensitive probaj sa funkcijom str_ireplace ili dodaj dodatne karaktere u str_replace:

$pret = str_replace(array('š', 'ć', 'č', 'ž', 's', 'c', 'z','Š', 'Ć', 'Č', 'Ž', 'S', 'C', 'Z'), array('(š|s)', '(ć|c)', '(č|c)', '(ž|z)', '(š|s)', '(c|ć|č)', '(ž|z)','(Š|S)', '(Ć|C)', '(Č|C)', '(Ž|Z)', '(Š|S)', '(C|Ć|Č)', '(Ž|Z)'), $pret);


Da, to je to Br@nko. Hvala jos jednom!

martinluter
08. 06. 2011., 10:21
^ ... @martinluter ne radi ti jer nisi postavio FULLTEXT index na TEXT polje...

ALTER TABLE `objekti` ADD FULLTEXT (`opis`)


Jao, koliko dzidumidza i peripetija ima oko mysql, ne mogu da ih povatam. Probacu i to, bas da vimo.

martinluter
08. 06. 2011., 10:27
Moze li mi neko pojasniti razliku kod ova dva rezultata, za iste pojomve 'apartmaji maja'?

www.slovenijaturizem.com/testing.php koriscen je REGEXP
www.slovenijaturizem.com/testing1.php koriscen je LIKE

LIKE pronalazi 10x vise rezultata.
Pretrazuje se i VARCHAR koji je u naslovu i TEXT koji je u opisu.
'Apartmaji Maja' je naziv smestaja i nalazi se u naslovu, ali ova rec 'maja' se nalazi u opis kod veceg broja upisa, tako da ih LIKE pronalazi i racuna tu rec 'maja' u svim tim upisima.
Na isti nacin se ponasa i full text kao i LIKE. Zato sam uzeo REGEXP, jer mi daje preciznije rezultate. Sad tacno zasto, ne znam.

webarto
08. 06. 2011., 10:48
SELECT id FROM objekti WHERE opis LIKE '%apartmaji maja%'
SELECT id FROM objekti WHERE MATCH (opis) AGAINST ('+apartmaji +maja');

Kako si ti upisao taj LIKE? Ne bi trebao da vraća...

Postavi sve SQL upite...

martinluter
08. 06. 2011., 11:18
SELECT id FROM objekti WHERE opis LIKE '%apartmaji maja%'
SELECT id FROM objekti WHERE MATCH (opis) AGAINST ('+apartmaji +maja');

Kako si ti upisao taj LIKE? Ne bi trebao da vraća...

Postavi sve SQL upite...


www.slovenijaturizem.com/testing.php koriscen je REGEXP
www.slovenijaturizem.com/testing1.php koriscen je LIKE
www.slovenijaturizem.com/testing2.php koriscen je FULL TEXT


$br_rez=mysql_num_rows(mysql_query("SELECT * FROM objekti WHERE akt='Y' AND (naslov REGEXP '[[:<:]]apartmaji[[:>:]]' OR opis REGEXP '[[:<:]]apartmaji[[:>:]]' ) AND (naslov REGEXP '[[:<:]]maja[[:>:]]' OR opis REGEXP '[[:<:]]maja[[:>:]]' )"));

$br_rez=mysql_num_rows(mysql_query("SELECT * FROM objekti WHERE akt='Y' AND (naslov LIKE '%apartmaji%' OR opis LIKE '%apartmaji%') AND (naslov LIKE '%maja%' OR opis LIKE '%maja%')"));

$br_rez=mysql_num_rows(mysql_query("SELECT * FROM objekti WHERE MATCH(opis) AGAINST('+apartmaji +maja')"));

webarto
08. 06. 2011., 15:09
Pa probaj ovako za naslov i opis, kako si ti postavio to je sasvim normalno što se dešava...

SELECT id FROM objekti WHERE opis LIKE '%apartmaji%maja%'

"naslov" je VARCHAR a FULLTEXT radi samo na TEXT, je li... Ukombinuj FULLTEXT i LIKE i to će ti biti riješenje.

martinluter
08. 06. 2011., 16:51
Pa probaj ovako za naslov i opis, kako si ti postavio to je sasvim normalno što se dešava...

SELECT id FROM objekti WHERE opis LIKE '%apartmaji%maja%'

"naslov" je VARCHAR a FULLTEXT radi samo na TEXT, je li... Ukombinuj FULLTEXT i LIKE i to će ti biti riješenje.

Pa tako ti je to kad ne poznajem materiju u potpunosti, ucim iz primera i gresaka, jer mi je nepoznavanje egleskog velika muka, onda se postavljaju i ovakva pitanja.
HVala svima kojii su ucestvovali u temi!

dinke
08. 06. 2011., 17:40
^Imas Full Text Searches tutorijal na mom blogu na srpskom:

http://www.dinke.net/blog/2006/01/20/mysql-full-text-searches/

Generalno za ovo sto tebi treba potpuno je pogresno koristiti i like i regexp iz jednostavnog razloga jer nije moguce koristiti indexe, tako da ce sa malo vecim setom podataka biti veoma sporo.

martinluter
08. 06. 2011., 19:05
^Imas Full Text Searches tutorijal na mom blogu na srpskom:

http://www.dinke.net/blog/2006/01/20/mysql-full-text-searches/

Generalno za ovo sto tebi treba potpuno je pogresno koristiti i like i regexp iz jednostavnog razloga jer nije moguce koristiti indexe, tako da ce sa malo vecim setom podataka biti veoma sporo.

Hvala puno Dinke za ovaj link!

Videcu da ubacim kod pretrage teksta FULL TETXT, a za Varchar da bude LIKE.

webarto
08. 06. 2011., 19:27
Uradi ovo jednom...

ALTER TABLE `objekti` ADD FULLTEXT (`naslov`);

I ovaj query probaj za pretrage...

SELECT id FROM objekti WHERE MATCH (opis,naslov) AGAINST ('+apartmaji +maja');

Ja sam zaboravio da FULLTEXT može i na VARCHAR :)

Kada koristiš LIKE '%nesto%', onda je nije to to, a LIKE 'nesto%' može proći, ali opet nije to to što se tiče pretrage, znači FULLTEXT.

Edit:

Nisam siguran da ćeš moći ovako kako sam gore napisao. Pa probaj i ovako onda...

SELECT id FROM objekti WHERE MATCH (naslov) AGAINST ('+paradoks +maja') AND MATCH (opis) AGAINST ('+paradoks +maja')