Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

match(...) against(...) problem?

[es] :: MySQL :: match(...) against(...) problem?

[ Pregleda: 2171 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

nezki
Miodrag Lapcevic
Beograd

Član broj: 101503
Poruke: 438
212.200.65.*

Sajt: www.websolutions.co.rs


Profil

icon match(...) against(...) problem?21.05.2009. u 06:22 - pre 129 meseci
Imam problem sa full text searchingom sa nasim slovima. Imam jednostavan zadatak da pretrazim dve kolone u bazi za unetu frazu preko forme.
Koristim PHP na serverskoj strani i stavio sam upit:
$query = "
SELECT *,
MATCH(prva_kolona, druga_kolona) AGAINST ('$trazena_fraza' IN BOOLEAN MODE) AS score
FROM product
WHERE MATCH(prva_kolona, druga_kolona) AGAINST ('$trazena_fraza' IN BOOLEAN MODE)";
Sve radi ok kada u trazenoj frazi nema nasih slova, ali cim imam nasa slova ne radi uopste.
Sto se tice charseta probao sam i sa
ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
i sa
ENGINE=MyISAM DEFAULT CHARSET=latin1;
ali ne radi ni jedna ni druga varijanta.

Probao sma da izbacim iz querija IN BOOLEAN MODE ali opet ne radi.
Da li neko moze da mi pomogne?
Unapred hvala

djLapac
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15173
*.mysql.rs.

Sajt: mysql.rs


+2312 Profil

icon Re: match(...) against(...) problem?21.05.2009. u 07:25 - pre 129 meseci
da li su ti polja u tabeli utf8? daj izlaz "SHOW CREATE TABLE product\G" da vidimo sta tu pise.
da li si setovao konekciju prema bazi na UTF8? (iz php-a to radis tako sto uradis query "set names 'UTF8'")
 
Odgovor na temu

nezki
Miodrag Lapcevic
Beograd

Član broj: 101503
Poruke: 438
212.200.65.*

Sajt: www.websolutions.co.rs


Profil

icon Re: match(...) against(...) problem?21.05.2009. u 07:34 - pre 129 meseci
Code:

CREATE TABLE `product` (
  `product_id` int(11) NOT NULL auto_increment,
  `category_id` int(11) NOT NULL,
  `program_id` int(11) NOT NULL,
  `name` varchar(255) collate utf8_unicode_ci default NULL,
  `description` text collate utf8_unicode_ci,
  `thumb` varchar(255) collate utf8_unicode_ci default NULL,
  `img` varchar(255) collate utf8_unicode_ci default NULL,
  `status` tinyint(4) default '0',
  `date` bigint(20) default NULL,
  PRIMARY KEY  (`product_id`),
  FULLTEXT KEY `description` (`description`,`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE `product` (
  `product_id` int(11) NOT NULL auto_increment,
  `category_id` int(11) default NULL,
  `program_id` int(11) default NULL,
  `name` varchar(255) default NULL,
  `description` text,
  `thumb` varchar(255) default NULL,
  `img` varchar(255) default NULL,
  `status` tinyint(4) default NULL,
  `date` bigint(20) default NULL,
  PRIMARY KEY  (`product_id`),
  FULLTEXT KEY `name` (`name`,`description`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


Evo pokusao sam i sa jednom i drugom varijantom ali mi ne radi. Inace pretrazujem polja name i description.
Da pokusao sam i sa mysql_query("set names utf8") ali i dalje nece da radi.


djLapac
 
Odgovor na temu

Shinhan
PHP programmer
Subotica

Član broj: 12327
Poruke: 372
*.static.isp.telekom.rs.

Jabber: shinhan@elitesecurity.org
ICQ: 400847988


+4 Profil

icon Re: match(...) against(...) problem?21.05.2009. u 07:41 - pre 129 meseci
Pošto si prebacivao collation iz UTF-8 u Latin1, sad ti sigurno u bazi više nema srpskih slova.
"Common sense is not so common." - Voltaire
 
Odgovor na temu

nezki
Miodrag Lapcevic
Beograd

Član broj: 101503
Poruke: 438
212.200.65.*

Sajt: www.websolutions.co.rs


Profil

icon Re: match(...) against(...) problem?21.05.2009. u 07:58 - pre 129 meseci
Nisam prebacivao vec sam uradio DROP TABLE trve tabele product u kojoj je collation bio UTF-8, pa sam onda kreirao novu tabelu sa collation latin1.
Evo ostavicu primer skripte koja nece da radi
Code:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="generator" content="">
<title>Search test</title>
</head>
<body>
<?php 
   /* call this script "advs.php" */
   if(!$c) { 
?>
<form action="test.php?c=1" method=POST>
<b>Find Results with: </b><br>
Any of these words: <input type="text" length=40 name="any"> <br>
All of these words: <input type="text" length=40 name="all"> <br>
None of these words: <input type="text" length=40 name="none"> <br>
<input type="submit" value="Search">
</form>
<?
   } else if($c) {
   MySQL_connect("localhost", "root", "root");
   MySQL_select_db("zavese");
   MySQL_query("set names utf8");
   
   if((!$all) || ($all == "")) { $all = ""; } else { $all = "+(".$all.")"; }
   if((!$any) || ($any == "")) { $any = ""; } 
   if((!$none) || ($none == "")) { $none = ""; } else { $none = "-(".$none.")"; }
   $query = "
       SELECT *,
          MATCH(name, description) AGAINST ('$all $none $any' IN BOOLEAN MODE) AS score 
          FROM product 
       WHERE MATCH(name, description) AGAINST ('$all $none $any' IN BOOLEAN MODE)";
      $artm1 = MySQL_query($query);
      if(!$artm1) { 
         echo MySQL_error()."<br>$query<br>"; 
      }
      echo "<b>Product Matches</b><br>";
      if(MySQL_num_rows($artm1) > 0) {
         echo "<table>";
          echo "<tr><td>Score </td><td>Name </td><td>Description</td></tr>";
             while($artm2 = MySQL_fetch_array($artm1)) {
            $val = round($artm2['score'], 3);
            $val = $val*100;
            echo "<tr><td>$val</td>";
            echo "<td>{$artm2['name']}</td>";
            echo "<td>{$artm2['description']}</td></tr>";
         }
      echo "</table>";
   }
   else { 
      echo "No Results were found in this category.<br>"; 
   }
   echo "<br>"; 
   } 
?>
</body>
</html>

djLapac
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15173
*.mysql.rs.

Sajt: mysql.rs


+2312 Profil

icon Re: match(...) against(...) problem?21.05.2009. u 08:45 - pre 129 meseci
radi ovo

Code:


mysql> select * from product;
+------------+-------------+------------+----------------------------+----------------------------+-------+------+--------+------+
| product_id | category_id | program_id | name                       | description                | thumb | img  | status | date |
+------------+-------------+------------+----------------------------+----------------------------+-------+------+--------+------+
|          1 |           1 |          2 | pera mika zika             | pera mika zika             | NULL  | NULL |      0 | NULL | 
|          2 |           1 |          2 | pera mika žika             | pera mika žika             | NULL  | NULL |      0 | NULL | 
|          3 |           1 |          2 | pera mika žika             | pera mika žika             | NULL  | NULL |      0 | NULL | 
|          4 |           1 |          2 | pera mika žika             | pera mika žika             | NULL  | NULL |      0 | NULL | 
+------------+-------------+------------+----------------------------+----------------------------+-------+------+--------+------+
4 rows in set (0.00 sec)

mysql> show create table product\G
*************************** 1. row ***************************
       Table: product
Create Table: CREATE TABLE `product` (
  `product_id` int(11) NOT NULL AUTO_INCREMENT,
  `category_id` int(11) NOT NULL,
  `program_id` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `description` text COLLATE utf8_unicode_ci,
  `thumb` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `img` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `status` tinyint(4) DEFAULT '0',
  `date` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`product_id`),
  FULLTEXT KEY `description` (`description`,`name`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)

mysql> SELECT name, MATCH ( name, description)
    -> AGAINST ('pera' IN BOOLEAN MODE) AS score FROM product;
+----------------------------+-------+
| name                       | score |
+----------------------------+-------+
| pera mika zika             |     0 | 
| pera mika žika             |     1 | 
| pera mika žika             |     1 | 
| pera mika žika             |     0 | 
+----------------------------+-------+
4 rows in set (0.00 sec)





dakle bez ikakvih promena u tome sto si ti poslao....

proveri kakvi su ti podaci u bazi .. da li si u bazu upisivao podatke kroz utf ili neku drugu konekciju
 
Odgovor na temu

nezki
Miodrag Lapcevic
Beograd

Član broj: 101503
Poruke: 438
212.200.65.*

Sajt: www.websolutions.co.rs


Profil

icon Re: match(...) against(...) problem?21.05.2009. u 09:21 - pre 129 meseci
Da to radi
Ja sam podatke u bazu upisvao preko forme sa html stranice charset je utf-u, i nece da radi.
Ovo sto si ti isprobao znam da radi jer ti trazena rec ne sadrzi nasa slova, probaj da uneses u tabelu 'pera saša đura' a za trazenu rec unesi 'đura' ili 'saša' i videces da ti nece nista vratiti
djLapac
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15173
*.mysql.rs.

Sajt: mysql.rs


+2312 Profil

icon Re: match(...) against(...) problem?21.05.2009. u 09:40 - pre 129 meseci
Code:


mysql> SELECT name, MATCH ( name, description) AGAINST ('pera' IN BOOLEAN MODE) AS score FROM product;
+----------------------------+-------+
| name                       | score |
+----------------------------+-------+
| pera mika zika             |     0 | 
| pera mika žika             |     1 | 
| pera mika žika             |     1 | 
| pera mika žika             |     0 | 
+----------------------------+-------+
4 rows in set (0.00 sec)



ovo je gore sve cirilica :) ... nego ga izgleda forum prebacije u latinicu ... cak i delove u code tagu :( ...


evo ti latinica:
Code:

mysql> SELECT name, MATCH ( name, description) AGAINST ('žika' IN BOOLEAN MODE) AS score FROM product;
+----------------------------+-------+
| name                       | score |
+----------------------------+-------+
| pera mika zika             |     1 | 
| pera mika žika             |     0 | 
| pera mika žika             |     0 | 
| pera mika žika             |     1 | 
+----------------------------+-------+
4 rows in set (0.00 sec)



ocigledno si pogresno ubacio podatke u bazu, pazi, ako si unosio sa html forme koja je utf8 ali nisi u php-u rekao za konekciju "set names utf8" ti imas "djubre" u bazi, tj, svaki dvobajtni karkter ti je pretvocen u 2 latin1 karaktera (jednobajtna) pa svaki od ta 2 latin1 karaktera prebacen u utf8 .. tako da u stvari ti sada za svaki cirilicni karakter na primer imas 6 bajta u mysql polju !!!

uradi select HEX(name) pa vidi sta ce da ti vrati ...


Prikačeni fajlovi
 
Odgovor na temu

nezki
Miodrag Lapcevic
Beograd

Član broj: 101503
Poruke: 438
212.200.65.*

Sajt: www.websolutions.co.rs


Profil

icon Re: match(...) against(...) problem?22.05.2009. u 06:22 - pre 129 meseci
Moja greska. Ova skripta radi sasvim ok, nego sam ja podatke u bazu unosio sa druge skripte na kojoj nisam rekao za konekciju "set names utf8".
Dakle da bi full text search radio ok morate setovati konakciju mysql_query("set names utf8"), i na skripti kojom pretrazujete i kojom unosite podatke u bazu.
Hvala puno
djLapac
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15173
*.mysql.rs.

Sajt: mysql.rs


+2312 Profil

icon Re: match(...) against(...) problem?22.05.2009. u 07:09 - pre 129 meseci
yup, to onaj deo o "smecu u bazi" o kom sam pricao vise puta ... dakle cela poenta character set podrske znaci da postoje character set u kom se podaci cuvaju i character set konekcije a mysql vrsi konverziju po potrebi. Ako se ne setuje pravilan charset konekcije razna $%#&( se desavaju. Ono sto je zeznuto kod web-a je da to smece u bazi u web browseru izlgeda ok posto onih 6 bajtova koji se snime za jedan karakter se "unazad" opet iskonvertuju u latin1 pa ih php pljune kao dva bajta a browser interpretira kao utf8 i prikaze kako treba... dakle uvek obratite paznju na charset encoding konekcije
 
Odgovor na temu

[es] :: MySQL :: match(...) against(...) problem?

[ Pregleda: 2171 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.