Dobry den. Mam problem s fulltextovym vyhladavanim v MySQL (spojenie s PHP ale to je v podstate jedno). Pokrok som urobil uz tym, ze pri vyhladavani pouzivam BOOLEAN MODE. Teraz sa dostanme k problemu. Ide o to, ze diakriticky spravne napisane slova mi to najde, mam tabulku skuska so stlpcami id a text, id (1,2,3) a text (1. text obsahuje slovo 'problémy' ; 2. text obsahuje slovo 'TRENČÍN' a 3.text obsahuje slovo 'muž') Ak do skriptu dosadim , aby to hladalo slovo 'TRENČÍN' najde mi to, ale akonahle dosadim slovo 'trencin' alebo 'TRENCIN' nenajde to nic.. Tak isto aj v ostatnych pripadoch. Tu je moj PHP kod:
<?php
mysql_connect("server","uzivatel","heslo");
mysql_select_db("databaza");
mysql_query("SET NAMES 'utf8'");
$sql="SELECT * FROM skuska WHERE match (text) against ('TRENCIN' IN BOOLEAN MODE) ORDER BY id";
$result = mysql_query($sql) or die(mysql_error());
while($row=mysql_fetch_array($result))
{
echo "ID je '".$row['id']."' ";
}
?>
V tomto pripade mi nenajde nic, vidite v $sql ze som dosadil slovo 'TRENCIN'. Kde moze byt potencionalna chyba? Mam zle napisany skript? Alebo zle nastavenu MySQL? A ak je nahodou este lepsi typ vyhladavania ako ten moj, poviete mi ho? S fulltextovym vyhladavanim som sa stretol vcera prvy krat.
Dakujem
There is no flag large enough to cover the shame of killing innocent people
Inak, ja to riesim tak, ze si proste vytvorim index na disku, kde mam text ulozeny bez diakritiky, bez tagov a zopar dalsich veci (proste je tam len plaintext) a nad nim robim vektorovy full-text search, pricom z query tiez odstranim tagy, diakritiku a vsetko, co tam nepatri. Napisat si to rucne nie je az taky problem. Na nete je hromada navodov a clovek si to aspon moze trochu zoptimalizovat a dostat pekne vysledky (google suvix). Pripadne, ak sa s tym nechces babrat, tak si proste urob este jeden stlpec, kde ten text budes mat bez diakritiky a rob vyhladavanie nad nim. A na odstranenie diakritiky mozes pouzit volanie recode.
existuje nejaka funkcia v MySQL co vyhodi diakritiku, mozno by stacilo zenit toto: WHERE match (text), otazkou co to urobi s vykonom stroja. aby ta z toho freehostinu nevytoto aj s ohnostrojom.
inak este je mozne napisat si vlastnu implementaciu daneho engine, pred casom sa to tu rozoberalo.
match iconv("utf-8", "ascii", text)
ak tam mas data v utf8, malo by to byt utf8
Spravil som si funkciu, ktora mi z textu nahradi pismena s diakritikou za obycajne + cely text bude napisany malymi pismenami.
Ak chcete, funkcia:
<?php
function nahrad($text)
{
$najst=array
(
"ľ", "š", "č", "ť", "ž", "ý", "á", "í", "é", "ä", "ú", "ň", "ó", "ď", "ô", "ĺ", "ŕ",
"Ľ", "Š", "Č", "Ť", "Ž", "Ý", "Á", "Í", "É", "Á", "Ú", "Ň", "Ó", "Ď", "Ô", "Ĺ", "Ŕ"
);
$nahradit=array
(
"l", "s", "c", "t", "z", "y", "a", "i", "e", "a", "u", "n", "o", "d", "o", "l", "r",
"l", "s", "c", "t", "z", "y", "a", "i", "e", "a", "u", "n", "o", "d", "o", "l", "r"
);
$novy_text=str_replace($najst, $nahradit, $text);
$konecny=strtolower($novy_text);
return "$konecny";
}
?>
A potom pouzit takto:
$string="Nejaký text ktorý chceme prehodiť.";
$vysledok=nahrad($string);
Text ulozim vo dvoch verziach - pre zobrazenie a pre vyhladavanie.
Vstup z vyhladavania taktiez prebehnem cez funkciu nahrad a frazu sa pokusim najst v DB cez query ktore som napisal hore.
Pozn.: str_replace som musel pouzit takym sialenym sposobom, kedze dokonale StrTr nevie pracovat s utf8..
Snad to niekomu pomoze.
Dakujem za pomoc a good luck prajem uzivatelom ktori to niekedy budu potrebovat
prijemny zvysok dna.
potom sa ozvi ked budes opisovat napriklad "vörös" (silno) cerveny, rysavy, pouzivane aj pri niektorych druhoch vina a jedna sa aj o relativne caste priezvisko.
iconv("utf-8", "ascii", text)
$dia = "áäčďéíľĺňóôŕšťúýžÁČĎÉÍĽĹŇÓŠŤÚÝŽ";
Problem je ale v tom, ze hoci mi najde hladane slovo v texte, neviem ho zvyraznit. Proste chcem, aby najdene slovo v texte bolo zvyraznene tucnym. A kedze vyhladava v texte bez diakritiky a ja potrebujem oznacit slovo v texte s diakritikou, vznika vazny problem ... Za normalnych okolnosti by fungovalo toto:$zaznam=eregi_replace( $searchx,'.$searchx.',$zaznam); lenze takto to zvyrazni slovo bez diakritiky... vie niekto pomoct?$nodia = "aacdeillnoorstuyzACDEILLNOSTUYZ";
$searchx = strtr($_POST['search'], $dia, $nodia);
$searchx = strtolower($searchx);
SELECT * FROM sekcie WHERE (sekcia_desc REGEXP '^(spra|pre|stav)$' OR sekcia_title REGEXP '^(spra|pre|stav)$' OR sekcia_name REGEXP '^(spra|pre|stav)$') AND sekcia_status='a'
kde robim chybu? alebo co by ste mi poradili Vy?
Dokaze to toto :