Starší komentáře ke článku: Fulltextové vyhľadávanie v MySQL - teória
Zpět na článek | Úvodní stránka Interval.cz
Datum vložení: 6.2.2004 5:03:09
Článek jsem jen prolétl, protože vím, že fulltext pro češtinu/slovenčinu v MySQL nefunguje. Čeština totiž slova ohýbá, s čímž si MySQL zatím nedokáže poradit. Potřeboval jsem fulltextové hledání, což jsem vyřešil stylem "kmen%". Na naprostou většinou slov tohle řešení zabírá. Jak zjistit počet výskytů kmenu v textu jsem řešil ještě ve starých fórech s Víťou (=Marabu). Na žádost mohu zveřejnit výsledek svého snažení, třeba formou článku (bohužel ne na Intervalu).
BTW Jak se obsah článku liší od manuálu? :-( <a href='http://www.mysql.com/doc/en/Fulltext_Search.html' target='_blank'>http://www.mysql.com/doc/en/Fulltext_Search.html</a>
Datum vložení: 6.2.2004 6:44:00
Ritchie, bylo by fajn, kdybys to někde zveřejnil. Jestli tak učiníš, dej pak link, kde to najdu:)
Jinak článek dobrý, jen je tam ten nevyřešený problém s tou češtinou:(
Datum vložení: 6.2.2004 10:18:31
V publikaci na Interval.cz Vám nikdo nebrání ;-)
Datum vložení: 6.2.2004 13:24:47
Brání a to pětiletá exklusivita. Jsem zvyklý zacházet s plody své duševní práce bez omezení. Pět let je v IT věčnost... Ostatně psal jsem vám to v mailu (snad jste jej nevyřadil spolu se spamem :-/). Především bych chtěl články rovněž zveřejňovat na svých budoucích stránkách (třeba s půlročním zpožděním oproti Intervalu), což nepovolujete. Alespoň tak jsem pochopil z vašeho mailu.
Datum vložení: 6.2.2004 13:59:04
Velmi správně. Za články platíme a požadujeme na ně pětiletou exkluzivitu (a nikoli dle zákona až 70-ti letou). Autorům ponecháváme možnost volně kamkoli umisťovat název, anotaci a abstrakt článku, po dohodě umožňujeme například přetisk článku v knize nebo v časopise. Obávám se, že Vám žádné profesionální médium nenabídne výhodnější podmínky.
Datum vložení: 6.2.2004 10:29:18
Preco nemozete zverejnit svoj clanok na Intervale??? Bezi tu nejaka diskriminacia?
Datum vložení: 6.2.2004 10:55:59
Ritchie ozvi se mi na hekerlej@selfnet.cz, dik
Datum vložení: 6.2.2004 17:43:30
Mate pravdu. FULLTEXT v MySQL nie je to prave pre cestinu a ani pre ostatne jazyky, ktore pouzivaju sklonovanie. Je tu este druhy problem, ktory sa tyka diakritiky. Pozrite si len ludi, ktori prispievali do tohto fora a vsimnite si pocet tych, ktory pouzivaju diakritiku. To vsetko sa da vyriesit pomocou regularnych vyrazov, avsak v MATCH() sa pouzit nedaju. Ja som sa s tym zaoberal a urobil som script, ktory riesi problem s diakritikou.
Zaujimalo by aj mna, ako ste vyriesili problem so sklonovanim (ohybanim). Diakritiku neberte do uvahy. Mam na mysli nasledujuci priklad:
hladany retazec: kamenna chalupa
mozne vysledky:
1. kamenna chalupa
2. chalupa z kamene
Pokial som vas spravne pochopil, tak z kazdeho slova ziskate kmenove slovo t.j. kamen, chalupa a tym priradite znak%. V tom pripade najdete obidva vyrazy. Avsak je tu otazka, ako chcete ziskat zo slova kmenove slovo? Pomocou nejakej databazy kmenovych slov? Alebo odfiltrovanim pripon? Tiez by to potom mala byt nejaka databaza pripon. Stopercentne to nevyriesite podkial nedate do databazy vsetky slova vo vsetkych padoch. To vsak je uplna blbost, riesit to takto. Tak potom ako dosiahut aspon 95% upesnost?
Ak sam to nepochopil dobre, a Vy pridavate za slovo znak %, t.j. kamenna%, chalupa%, tak Vam druhy zaznam vobec nevrati, ale navstebnika bude urcite zaujimat, pretoze vyznam je ten isty (ibaze by islo o meno nejake chalupy).
Co sa tyka odlisnosti od manualu, tak mate pravdu. Tento clanok je skoro rovnaky s maulom MySQL. K jeho napisaniu ma viedlo to, ze na niektorych diskusnych forach sa vyskytli otazky ako FULLTEXT rozbehat. Ti, ktori sa to pytali, pravdepodobne nevedeli dostatocne anglicky, aby si to prelozili. A ako chcete nejaku syntax prikazov vysvetlit inak? Pozruite sa na clanky, ktore popisuju rozne funkcie. Len tym, ze je tam pridany iny priklad neznamena, ze nie su totozne s manualom.
No a na zaver, myslim si,ze je pre monoho ludi citajucich Inteval lepsie precitat si clanok v slovencine ako v anglictine.
Datum vložení: 6.2.2004 18:21:13
Na to abyste rozbehal fulltext opravdu nestaci umet precist manual ;)
Datum vložení: 6.2.2004 9:04:53
No dobre ale mam teda navstevnika ktory vlozi vyhladavaci retazec
banan jablko ale obe slova sa nachadzaju vo vsetkych clankoch s rovnakym skore.... (teoria) a zrazu mu pri vyhladavani nevrati nic...
Ako riesite takuto vec?
Povedzme ze navstevnik nepozna IN_BOOLEAN_MODE ... si myslim ze je blbost vytvorit na stranke nieco ako vyhladavaci manual...
Datum vložení: 6.2.2004 9:35:07
Staci sikovne navrhnut moznosti volieb pomocou checkboxov, radio buttonov pripadne select boxov...
Datum vložení: 6.2.2004 12:28:09
lenze ja chcem mat na sajte len jeden textový input a dost. ziadne chcekboxy atd...
asi to vyrieisim v programe, ze ak nevypluje match against nič, tak ešte môžem poriešiť že retazec rozbijem a pouzijem Like and Like and Like ale 10 krat like v podmienke no neviem....
Datum vložení: 6.2.2004 13:04:44
adrive: ono jde hlavne o to ze timhle se dost ztraci relevance. My jsme to s Ritchiem resili, ja mu ukazoval dost silene reseni (lec perfektne funkcni) a neco o tom v dohledne dobe vyjde v ramci jineho clanku.
Datum vložení: 9.2.2004 15:56:10
jo tak na ten clanok sa budem tesit :)) uz nech vyjde...
Datum vložení: 6.2.2004 14:17:42
Proč by mělo být nutné učit návštěvníka obsah tohoto článku? Ten se máte naučit Vy, než budete programovat nějakou aplikaci, například vyhledávací stroj typu Jyxo ;-)
Datum vložení: 6.2.2004 17:49:42
Co sa tyka manualu na vyhladavanie, mate pravdu, nie je to OK. Tento problem som vyriesil pomocou chechkboxov a radio buttonov (ako tu uz bolo spomenute v pripevkoch) v clanku, ktory by mal byt takym pokracovanim tohto. Poslal som ho redakcii spoju s tym, tak uvidime, ci ho publikuju...
Datum vložení: 6.2.2004 19:17:05
Píšete, že AGAINST() je "case insensitive", ale to není tak docela pravda. Koukněte se do manuálu MySQL. Tam je sice napsáno, že AGAINST
velká/malá písmena nerozlišuje, ale že jsou jazyky, u kterých tomu tak není
a jako příklad je tam jmenovaná právě čeština.
Viz <a href='http://www.mysql.com/doc/en/Case_sensitivity.html' target='_blank'>http://www.mysql.com/doc/en/Case_sensitivity.html</a>
"MySQL searches are not case sensitive (although there are some character sets that are never case-insensitive, such as czech)".
A podle svých zkušeností mohu potvrdit, že skutečně záleží na tom, jaký má
daná tabulka nastavený character set. Téměř všude to funguje kromě češtiny a asi slovenštiny :-(
Datum vložení: 6.2.2004 23:50:26
Mam dotaz k tomu vyhledavani a treba mi nekdo odpovite.
Zjistil jsem, ze kdyz treba vyhledavam jmena(treba tel. seznam), rekneme Novak, tak zadám napr. novak a jmeno se najde, ale kdyz hledam treba Šiborová a zadam šiborová nebo jen š, tak to nic nenajde. Musím zadat Šib nebo Š a pak se to vyhleda.
Cim to je a neda se to nekde nastavit (nemyslim tim nejaky script pro prevod znaku), ale nejaky nastaveni?
Je to PHP4 a MySql.
Datum vložení: 14.2.2004 12:04:02
To je vcelku jednoduche - kdyz je neco na pocitacich case insensitive (nerozlisuje mala a velka pismena) znamena to, ze vsechen text, ktery zpracovava si nejprve prevede na mala, nebo velka pismena jak kde a pak teprve pracuje dal. A prave v prevodu je ten probelm, ktery se s pocitacema tahne od jejich vzniku a asi je nikdy neopusti.
Kdyz pocitace vznikly byla u toho v hlavni mire anglictina - ktera nema zadne zvlastni znaky takze znakova sada kterou pocitac znal obsahovala pouze "anglicka" pismena (zadne hacky, carky, prehlasky atd.) a mimo pismen je tam samozrejme spousta grafickych a nezobrazovanych znaku. Problem teto tabulky znaku je, ze se v ramci uspory mista v pameti reklo staci nam 255 znaku (1 Byte) tabulku tedy nelze dale rozsirovat. V tabulce ma kazdy znak sve cislo a pismena jsou serazena podle abecedy nejprve velka a pak mala. Prevod na velka funguje tedy nasledovne pokud je znak male pismeno, tak se od jeho poradoveho cisla odecte 32 (nejsem si 100% jist zda opravdu 32) proste rozdil mezi VELKYM "A" a malym "a", pokud je pismeno velke nic se nedeje, takhle se projede cely textovy retezec a vysledkem je textovy retezec obsahujici pouze velka pismena. Pokud byla pouze anglictina bylo vse bez problemu.
S dalsim rozvojem pocitacu prisli vsak pozadavky na dalsi pismena z neaglickych zemi. Znakovou sadu nebylo mozne rozsirit protoze vsech 255 znaku bylo obsazeno, tak se to vzdy pro konkretni jazyk resilo tak, ze se ozelely ruzne graficke znaky a nahradili se specielnimi pismeny jednotlivych abeced, ale zde uz nebylo mozne zachovat stejnou vzdalenost mezi znaky a to je prave pricina ze z maleho č nelze udelat VELKE Č prictenim 32 jako u pismen a-z, dokonce ani nelze rict, ze rozdil mezi č a Č je stejny jako ř a Ř, ci ď a Ď. Aby bylo mozne prevadet takove "specialni pismena" musi se udelat prevod pro jednotliva pismena a to je pracne zvlaste, kdyz pro jeden jazyk existuje i vice tabulek znaku (cestina zacala s LATIN2, pak se pridaly KAMENICI (protoze v LATIN2 chybely nejake potrebne graficke znaky) a pak pokracovali dalsi a dalsi a vysledek je ze pro ceskou abecedu lze pouzit asi 8 jazykovych sad a kazda ma ty hackovany pismenka jinde. To je pak take duvod ze se obcas stane ze to co napisu s hackama ja na druhy starne republiky nekdo neprecte protoze z nejakeho duvodu pouziva jinou jazykovou sadu.
Datum vložení: 14.2.2004 19:58:59
Hezká exkurse do počítačové prehistorie, nicméně v dnešní době, kdy počítače bez nejmenších problémů dokáží zpracovávat i písma dávno zaniklých národů, poněkud mimo. Buď jde o chybu koncepce programu nebo o povýšeneckou ignoraci programátorů, pokud se ve svém produktu nedokáží vyrovnat s takovou maličkostí, jako jsou odlišné znakové sady a nutnost operovat v nich přes převodní tabulky.
Datum vložení: 15.2.2004 14:18:27
Souhlasim, ze by to pocitace bez problemu zvladli - obecne plati ze pocitac je schopen zvladnout uplne vsechno, ale musi ho to programator naucit a to je ten kamen urazu. A musim se, ac nerad, trosku zastat programatoru a ohradit se proti pojmu "povyseneckou ignoraci", verim, ze treba pro nemcinu je fultext takto upraven, preci jenom nemcinu pouziva trosku vic lidi nez cestinu. A programator (spis skupina), tvorici program neco o nemcine tusi, ale cestina - Co to je? To je jako jazyk? Nakej asiskej ne, nebo to je v africe? To by byla odpoved asi valne vetsiny programatoru ze zamori, pokud by to zrovna nebyl priznivec hokeje a nebyl na cechy nastvanej, ze zabiraj americanum misto v NHL a ze obcas USA vyklepnou. Takze vse je spis zpusobeno neznalosti a pak teprv prehlizenim - co bych se stim pro tech 5 lidi z CZECH patlal.
Kdyz to tak po sobe ctu - jsou to POVYSENY IGNORANTI - bo neznalost neomlouva.
Asi se zase bude muset najit nakej sikovnej cechacek, kterej to za ne napise - slava takovym.
Datum vložení: 16.2.2004 9:54:46
Jen tak mimochodem, inspirací programátorům by mohl být například dokument <a href='http://www.faqs.org/rfcs/rfc3491.html' target='_blank'>http://www.faqs.org/rfcs/rfc3491.html</a> - RFC 3491 (Nameprep: A Stringprep Profile for Internationalized Domain Names).
(Takovou ptákovinu, jako šílené národní znaky v názvech domén, lidé vymyslet schopní jsou, ale v situaci, kdy by jejich snažení bylo namístě a mělo rozumný praktický efekt, to jdou radši na pivo ;-)
Datum vložení: 7.2.2004 10:51:44
Kdyz jsem si to precetl nabyl jsem dvou dojmu.
1. ze manual to jisti, jak bylo uvedeno vyse :-)
2. autorovi nerika nic verze 4.0.x a InnoDB. Aspon se mohl zminit, ze si clovek muze vybrat mezi transakcemi a cizimi klici / fulltextem. A jelikoz pro cestinu je nic moc, tak by si lide meli volit to prvni :-)
s pozdravem
Michal
Datum vložení: 13.2.2004 14:37:13
Mám dotaz, který asi až tak nezapadá do této diskuze. Mám například databázi jmen, které jsou samozřejmě uloženy s diakritikou. Pak mám nějaký skript (např. umístěn někde na webu) na vyhledávání v té databázi. V této databázi bych potřeboval vyhledávat tak, aby uživatel nemusel zadávat diakritiku, např. jméno SVĚRÁK by uživatel nalezl i když by vepsal jen SVERAKa a somozřejmě pokud by uživatel zadal jméno s diakritikou, nalezl by jej také.
Lze nějak zkonstruovat SQL dotaz, popřípadě nějak jinak dotaz upravit, aby vyhledal to co potřebuji a nemusel jsem používat diakritiku (pokud bych třeba nemohl) ?
Miloš
Datum vložení: 13.2.2004 15:25:06
Mozno to nie je prilis koser, ale ja som to vyriesil tak ze som si vytvoril druhu tabulku bez diakritiky identicku s diakritickou a potom som vyhladaval v ten nediakritickej ale vysledok som daval s tej tabulky kde boli texty s diakritikou.
Datum vložení: 22.7.2004 12:41:22
nebo(nejsem si jisty jestli by to tak slo, ale po precteni jednoho clanku bych to udelal takhle):
vyhledat "parez"
aby se naslo i "pařez":
p[aá][rřŘ][eé][zžŽ]
jestli nechapete, mel jsem na mysli skript ktery by pismanka nad kterymi muzou byt hacky nebo carky nahrazoval seznamy(pr: Č=[cčČ], č=[cčČ], c=[cčČ] apod.)
Datum vložení: 13.2.2004 15:42:34
<a href='http://forum.builder.cz/read.php?f=20&i=44351&t=44319' target='_blank'>http://forum.builder.cz/read.php?f=20&i=44351&t=44319</a>
Priste by to chtelo spis do fora.
Datum vložení: 10.3.2005 21:13:57
Řeším problém, který si neumím vůbec vysvětlit. Pokud prohlížím stránku v IE, všechno je v pořádku. V opeře se ale dostanu do situace, kdy MySQL hlásí chybu "1064: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1". Děje se to jen u jediného dotazu. Pokud byste mi někdo dovedl poradit, jak se takového problému zbavit, byl bych moc rád.
Datum vložení: 16.12.2005 12:22:17
Osobně si myslím, že by sis ten chybný dotaz měl nechat vypsat a pak uvidíš. Počítám že ten dotaz se konstruuje z nějakého GET nebo POST elementu a ten můžou různé prohlížeče poslat různě (různě kódované).