|
[ 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
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|