MySqL - Fulltextove vyhladavanie

Sekcia: Programovanie 04.03.2008 | 09:48
Avatar Dare_devil Debian, OpenSuse  Používateľ
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
    • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 12:39
      Avatar Dare_devil Debian, OpenSuse  Používateľ
      Pouzivam uz len against ('slovo') bez 'IN BOOLEAN MODE' ale stale, najde to len trenčín, trencin nie :(
      There is no flag large enough to cover the shame of killing innocent people
    • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 14:48
      Avatar Samuel BWPOW Kupka CentOS, Mandriva  Používateľ
      Ale ved trenčín a trencin su uplne rozdielne slova.
      Strach dát najevo své pocity a zjednat si u druhých respekt je jedním z problémů civilizovaného člověka, který se naučil zpochybňovat svou vlastní pravdu pro zdání objektivity
      • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 14:52
        Avatar Dare_devil Debian, OpenSuse  Používateľ
        Nieje sila fulltextu v tom ze hlada aj podla diakriticky nezhodnych slov?
        There is no flag large enough to cover the shame of killing innocent people
        • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 15:06
          Avatar Samuel BWPOW Kupka CentOS, Mandriva  Používateľ
          Si si isty, ze full-text search v mysql funguje tak, ako predpokladas? Slova trencin a trenčín sa odlišujú až v 2 písmenách z 7, čo je 28.5%. Pritom nejde o permutaciu, s cim by si to snad este poradilo, ale z pohladu mysql o uplne odlisne slova. Ved si len skus dat spocitat soundex tych slov.

          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.
          Strach dát najevo své pocity a zjednat si u druhých respekt je jedním z problémů civilizovaného člověka, který se naučil zpochybňovat svou vlastní pravdu pro zdání objektivity
          • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 15:23
            Avatar Dare_devil Debian, OpenSuse  Používateľ
            No ja som planoval robit to tak, ale myslel som ze to bude dlho trvat.. Ulozim text + kopiu k nemu bez diakritiky a so vsetkymi pismenami malymi.. A potom tak isto budem vyhladavat, vyhladavanu frazu premenim na male pismena + bez diakritiky a budem hladat. Ok dakujem
            There is no flag large enough to cover the shame of killing innocent people
            • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 15:44
              Avatar Samuel BWPOW Kupka CentOS, Mandriva  Používateľ
              Neviem sam, ci je to idealny sposob, kedze az tak som to nestudoval, ale da sa tym vyhnut dalsim problemom (s tymi tagmi napriklad, ak mas ulozeny html kod) a clovek si usetri hromadu nervov.
              Strach dát najevo své pocity a zjednat si u druhých respekt je jedním z problémů civilizovaného člověka, který se naučil zpochybňovat svou vlastní pravdu pro zdání objektivity
            • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 18:01
              Avatar nardew debian  Používateľ
              vzdy ked sa da, vyhybaj sa redudancii dat v DB
              • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 18:09
                Avatar Samuel BWPOW Kupka CentOS, Mandriva  Používateľ
                Uz samotne indexy su vlastne redundantny udaj. Pohlady (VIEW) ani nehovorim :)
                Strach dát najevo své pocity a zjednat si u druhých respekt je jedním z problémů civilizovaného člověka, který se naučil zpochybňovat svou vlastní pravdu pro zdání objektivity
              • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 20:57
                Avatar Dare_devil Debian, OpenSuse  Používateľ
                Tak ako to teda mam robit ked nie takto? Nedonutim ludi, aby vyhladavane slova pisali s diakritikou a gramaticky spravne. Ked mi poviete preco mi to nejde a pomozete mi, aby mysql medzi TRENČÍN , TRENCIN a trencin nerobilo rozdiel, tak budem nuteny k takemuto rieseniu. PRoblem riesim od vcera vecera a chcem to mat co najskor z krku.
                There is no flag large enough to cover the shame of killing innocent people
                • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 21:04
                  WlaSaTy   Návštevník
                  niektore databazy mali moznost nastavit kodovu stranku pre index a MUSQL malo kedysi pradavno moznost vypnut pri vyhladavani diakritiku. nie je to tvoj pripad?
                  • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 21:11
                    Avatar Dare_devil Debian, OpenSuse  Používateľ
                    Pouzivam freehosting, aj keby som ich podplatil tak mi nedovolia manipulovat so vseobecnymi nastaveniami mysql
                    There is no flag large enough to cover the shame of killing innocent people
                    • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 21:17
                      WlaSaTy   Návštevník
                      freehosting, dobru chut.

                      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.
                      • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 21:34
                        Avatar Dare_devil Debian, OpenSuse  Používateľ
                        No freehosting je len docasny, na rozbehnutie projektu.. Ale asi to urobim tak ako som vravel, sice to nebude najidealnejsie riesenie, ale nemam na vyber a nechce sa mi s tym srat. Skusam sa este pytat na IRC blackhole mozno mi poradia tam. Ak zistim ako sa to da urobit, napisem ako sa to robi
                        There is no flag large enough to cover the shame of killing innocent people
                        • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 21:48
                          WlaSaTy   Návštevník
                          na moznost vytvorenia fulltext indexu bez pouzitia diakritiky si sa nepozeral, a toto ti to asi nezozerie (niektore veci obcas vyrobcovia povolia az v enterprise verziach):

                          match iconv("utf-8", "ascii", text)
          • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 21:48
            Avatar Miroslav Bendík Gentoo  Administrátor
            Íňšťáĺľ vyhľadané v mysql v databáze linuxos.
            • Re: MySqL - Fulltextove vyhladavanie 04.03.2008 | 21:54
              Avatar Dare_devil Debian, OpenSuse  Používateľ
              No, lenze skus tam dat "instalacia" a "inštalácia" najde to to tie iste vysledky.. A pritom ja potrebujem vyhladavat v gramaticky a diakriticky spravnych clankoch, nie vo fore kde nikto s diakritikou nepise
              There is no flag large enough to cover the shame of killing innocent people
    • Re: MySqL - Fulltextove vyhladavanie 05.03.2008 | 00:01
      Avatar michal00 debian, freebsd  Používateľ
      ake mas collate/charset na dane stlpce/tabulku ?

      ak tam mas data v utf8, malo by to byt utf8
      • Re: MySqL - Fulltextove vyhladavanie 05.03.2008 | 09:29
        Avatar Dare_devil Debian, OpenSuse  Používateľ
        utf8_czech_ci
        There is no flag large enough to cover the shame of killing innocent people
        • Re: MySqL - Fulltextove vyhladavanie 05.03.2008 | 11:04
          WlaSaTy   Návštevník
          Ja osobne vidim jadro problemu v tom, ze data su v databaze ulozene v UTF8 a aj vyuzivaju danu kodovu stranku (koli pouzitej diakritike) kdezto vyhladavanie sa ma robit v kodovej stranke ASCII (s vyhodenou diakritikou koli uzivatelom). Tomu ma zodpovedat pouzita technologia (indexy vytvorene tak aby ignorovali diakritiku). Otazkou je ako to dosiahnut bez vytvorenia vlastneho vyhladavacieho engine i ked MySQL je velmi flexibilne a ma priame vezby na api aj glibc a je mozne do neho dorobit vlastne funkcie a procedury.
          • Re: MySqL - Fulltextove vyhladavanie 05.03.2008 | 11:17
            Avatar Dare_devil Debian, OpenSuse  Používateľ
            No ja som to uz urobil.. Sice inac, ale miesta mam dost tak nevidim problem..
            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.
            There is no flag large enough to cover the shame of killing innocent people
            • Re: MySqL - Fulltextove vyhladavanie 05.03.2008 | 11:31
              WlaSaTy   Návštevník
              tiez sposob :)

              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)
            • Re: MySqL - Fulltextove vyhladavanie 05.03.2008 | 11:57
              Avatar uid0 Debian  Používateľ
              strtr vie nahradzat aj sekvenice, staci mu podsunut hash
              Debian. apt-get into it…
            • Re: MySqL - Fulltextove vyhladavanie 16.03.2008 | 05:59
              Wotan   Návštevník
              No ja riesim ten isty problem a tiez som to spravil tak ako ty.Vytvoril som stlpec v databaze, kde bude text bez diakritiky a malymi pismenami. Ja to odstranenie diakritiky mam takto: $dia = "áäčďéíľĺňóôŕšťúýžÁČĎÉÍĽĹŇÓŠŤÚÝŽ";
              $nodia = "aacdeillnoorstuyzACDEILLNOSTUYZ";
              $searchx = strtr($_POST['search'], $dia, $nodia);
              $searchx = strtolower($searchx);
              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?
              • Re: MySqL - Fulltextove vyhladavanie 16.03.2008 | 10:01
                Avatar Dare_devil Debian, OpenSuse  Používateľ
                Napadlo ma jedine riesenie - zisti poradie slova v texte a podla toho poradia zvyrazni slovo v texte s diakritikou
                There is no flag large enough to cover the shame of killing innocent people
    • Re: MySqL - Fulltextove vyhladavanie 11.08.2009 | 14:32
      Avatar Milan Dvorský debian,mint kde,android  Administrátor
      ja by som mal inu otazku, riesim tiez vyhladavanie a snazim sa to mat aj na pripadne viac slov. hladam v jednej tabulke, ktora nie je extremne velka (len do 150 riadkov) a spravil som select s vyuzitim regexp, no nejak mi to nehlada ako by som chcel, hoci sa nachadzaju aj ostatne vyrazy v tabulke a najde len jeden:
      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?
      • Re: MySqL - Fulltextove vyhladavanie 11.08.2009 | 14:58
        Avatar Dare_devil Debian, OpenSuse  Používateľ
        http://openpaste.org/en/16096/ heslo linuxos.sk

        Dokaze to toto :
        <form method="post" action="/search/">
        <input type="text" name="vyhladavanie" class="search" maxlength="50">
        <input type="submit" value="" class="submit">
        

        <div class="rozsirene" id="rozsirene"> Slova spájať ako:
        <input type="radio" name="operators" value="and"> A zároveň
        <input type="radio" name="operators" value="or" checked> Alebo
        <input type="radio" name="operators" value="quotes"> Hľadať presný reťazec

        Hľadať:
        <input type="checkbox" name="options[1]" value="yes" checked> v titulke
        <input type="checkbox" name="options[2]" value="yes" checked> v predhovore
        <input type="checkbox" name="options[3]" value="yes" checked> v celom článku
        </div>
        There is no flag large enough to cover the shame of killing innocent people