[ nezki @ 21.05.2009. 06:22 ] @
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
[ bogdan.kecman @ 21.05.2009. 07:25 ] @
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'")
[ nezki @ 21.05.2009. 07:34 ] @
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.

[ Shinhan @ 21.05.2009. 07:41 ] @
Pošto si prebacivao collation iz UTF-8 u Latin1, sad ti sigurno u bazi više nema srpskih slova.
[ nezki @ 21.05.2009. 07:58 ] @
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>
[ bogdan.kecman @ 21.05.2009. 08:45 ] @
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
[ nezki @ 21.05.2009. 09:21 ] @
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
[ bogdan.kecman @ 21.05.2009. 09:40 ] @
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 ...

[ nezki @ 22.05.2009. 06:22 ] @
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
[ bogdan.kecman @ 22.05.2009. 07:09 ] @
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