Zadejte hledaný výraz...

MySQL – hledání – zoufalý

derk
verified
rating uzivatele
(7 hodnocení)
11. 4. 2009 09:14:04
Jestli chceš z "muži" udělat "muž", budeš muset vzít databázi od kontroly pravopisu (nějakou free třeba z linuxu aspell, myspell), nastudovat syntaxe skloňování a pak si to podle toho vygenerovat.
http://web.archive.org/web/20070510084222/http://www.taborsky.cz/zapisnik/27.08.2005-novy-fulltext-internet-mallu
11. 4. 2009 09:14:04
https://webtrh.cz/diskuse/mysql-hledani-zoufaly/strana/2#reply281702
Jakub Stacho
verified
rating uzivatele
(20 hodnocení)
11. 4. 2009 13:02:02
Já skloňování a časování dělám takto prasácky:
Hledaný výraz zkrátím o 1 až 2 znaky - podle toho, jestli končí na samohlásku nebo souhlásku a podle toho, jak dlouhé to slovo je. Tím se dostanu víceméně na kořen slova a pak prostě pustím hledání LIKE $koren%.
U rozsáhlejších věcí, kde potřebuju fulltext, si často vytvářím duplikátní sloupec pouze pro účely hledání. Jednotlivá slova v něm jsou upravena podobným způsobem, odstraněny html tagy a stop slova, krátká slova navíc doplněna na délku ft_min_word_len.
Řadím to nakonec podle přesné shody, takže se různé „úlety“ odsunou na konec výsledků, ale nepřijde se o ně úplně.
11. 4. 2009 13:02:02
https://webtrh.cz/diskuse/mysql-hledani-zoufaly/strana/2#reply281701
Svata
verified
rating uzivatele
(3 hodnocení)
12. 4. 2009 14:44:15
Napsal tracy;262905
Já skloňování a časování dělám takto prasácky:
Hledaný výraz zkrátím o 1 až 2 znaky - podle toho, jestli končí na samohlásku nebo souhlásku a podle toho, jak dlouhé to slovo je. Tím se dostanu víceméně na kořen slova a pak prostě pustím hledání LIKE $koren%.
Docela jsem na tom stejně, jenom využívám fulltext.
Zkrátím o jeden znak a pak jednoduše
příklad "automobily" zkrátím na "automobil" a vyhledávám
WHERE MATCH (sloupec) AGAINST ('automobil*' IN BOOLEAN MODE)
- důležitá je hvězdička. Moc nezpomaluje a vyhledává řetězce, kde je na začátku "automobil" (vč. zkrácené verze)
a myslím, že to extra prasárna není ;)
12. 4. 2009 14:44:15
https://webtrh.cz/diskuse/mysql-hledani-zoufaly/strana/2#reply281700
grimword
verified
rating uzivatele
(25 hodnocení)
14. 4. 2009 01:01:24
a co počet záznamů (až 8000)? není problém s náročností?
14. 4. 2009 01:01:24
https://webtrh.cz/diskuse/mysql-hledani-zoufaly/strana/2#reply281699
Svata
verified
rating uzivatele
(3 hodnocení)
15. 4. 2009 16:26:37
8000 je pro mysql sranda.
Testoval jsem to v objemu nad 10 000 a bylo to rychlé jak střela.
15. 4. 2009 16:26:37
https://webtrh.cz/diskuse/mysql-hledani-zoufaly/strana/2#reply281698
duben
verified
rating uzivatele
(49 hodnocení)
15. 4. 2009 16:46:00
Tohle jde resit nekolika zpusoby a vetsina uz tady zaznela:
1. Pouzijes LIKE s procenty ... najde jen casti kde je slovo a nebo slovo+nejake znaky navic, kratsi nenajde. LIKE bude vykonovy problem pokud pouzivas sloupce typu text, nebo varchar nad 250 znaku a mas hodne zaznamu v DB (desetitisice az statisice). Like pro 8000 radku na MySQL na rozumnem DB stroji prakticky nebude rozdil od = nebo porovnani integeru ... desetiny vteriny pravdepodobne.
2. Porovnavaci funkce podobnosti stringu, funkce STRCMP(), vrati ti cislo podobnosti dvou stringu od sebe pomoci INT hodnoty. Na tobe je definovat jak moc podobne stringy chces brat v potaz.
3. Sklonovani orezavanim koncovky jak psal Tracy, bude ale fungovat jen pro cestinu a slova ktere jsou psana rovnou jako koren mohou byt i tak zkracena.
4. Pouziti databaze pro preklepy, synonyma, sklonovani apod. To JOINem napojis na stavajici tabulku a bude to fungovat bezchybne, ale pouze pro slova v te databazi zadana => velka narocnost vytvoreni a udrzby DB, navic takovy lexikon bude hodne veliky a musis dobre optimalizovat vykon jinak ti hledani pretizi DB. Velka vyhoda je moznost nalezeni i synonym nebo podobnych slov na zaklade vyznamove podobnosti.
Hodne promysli kolik lidi to vlastne bude pouzivat abys nesel zbytecne s kanonem na vrabce. Pro hodne lidi staci jen napoveda ve stylu "Nic nebylo nalezeno? Zkuste slovo jinak sklonit nebo pouzit mnozny tvar".
Samozrejmost by mela byt pred hledanim odstranit diakritiku a prevest znaky na Lowercase, pokud z nejakeho opravdu padneho duvodu nepotrebujes i shodu velikost znaku. Taky doporucuju udelat hledani pres LIKE a pokud bude navracenych zaznamu malo nebo zadne pouzit treba tu metodu STRCMP(). Je to asi nejlepsi kombinace v pomeru narocnost vytvoreni + zatizeni DB + vracene vysledky.
15. 4. 2009 16:46:00
https://webtrh.cz/diskuse/mysql-hledani-zoufaly/strana/2#reply281697
Jakub Stacho
verified
rating uzivatele
(20 hodnocení)
15. 4. 2009 17:32:28
Napsal duben;266191
Samozrejmost by mela byt pred hledanim odstranit diakritiku a prevest znaky na Lowercase, pokud z nejakeho opravdu padneho duvodu nepotrebujes i shodu velikost znaku.
S diakritikou máš pravdu. Ale lowerase/uppercase řešit nemusíš, pokud si nastavíš porovnávání třeba utf8_czech_ci - to ci znamená case insensitive.
15. 4. 2009 17:32:28
https://webtrh.cz/diskuse/mysql-hledani-zoufaly/strana/2#reply281696
grimword
verified
rating uzivatele
(25 hodnocení)
16. 4. 2009 00:36:57
duben
rep+
díky za shrnutí, kdyby se jednalo jenom doplňkovou funkci, tak by jsem tam dal třeba google, jenomže toto bude asi nejhlavnější věc na webu - asi jako hledání na youtube
16. 4. 2009 00:36:57
https://webtrh.cz/diskuse/mysql-hledani-zoufaly/strana/2#reply281695
Petr Vacek
verified
rating uzivatele
16. 4. 2009 00:39:00
Napsal duben;266191
2. Porovnavaci funkce podobnosti stringu, funkce STRCMP(), vrati ti cislo podobnosti dvou stringu od sebe pomoci INT hodnoty. Na tobe je definovat jak moc podobne stringy chces brat v potaz.
Jestli se nepletu tak funkce STRCMP porovnává délky řetězců, nikoliv jejich podobnost.
STRCMP('řízek','kočka') == 0
dle: http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#function_strcmp
16. 4. 2009 00:39:00
https://webtrh.cz/diskuse/mysql-hledani-zoufaly/strana/2#reply281694
Jakub Stacho
verified
rating uzivatele
(20 hodnocení)
16. 4. 2009 02:57:34
STRCMP je k ničemu - určuje jestli jdou stringy podle abecedy po sobě nebo naopak.
Duben asi myslel něco na způsob levenstein, což v mysql bohužel není. Dá se to ale brutálně vložit jako vlastní funkce: http://codejanitor.com/wp/2007/02/10/levenshtein-distance-as-a-mysql-stored-function/
16. 4. 2009 02:57:34
https://webtrh.cz/diskuse/mysql-hledani-zoufaly/strana/2#reply281693
grimword
verified
rating uzivatele
(25 hodnocení)
16. 4. 2009 03:43:48
tracy
mohl by jsi mi prosím trochu objasnit, jak se 'vkládá' taková funkce do MySQL? připomíná mi to jazyk používaný pro vytvoření tabulek, takže normálně do panelu v phpmyadminovi popř. spustit jako php skript? a jakým způsobem budu používat tuto funkci? při mysql dotazu?
nepotřebuji kompletní návod krok za krokem, spíš nakopnout
dík
16. 4. 2009 03:43:48
https://webtrh.cz/diskuse/mysql-hledani-zoufaly/strana/2#reply281692
Jakub Stacho
verified
rating uzivatele
(20 hodnocení)
16. 4. 2009 06:07:16
Musím se přiznat, že jsem to nikdy nedělal, ale v podstatě je to jeden velký SQL příkaz. Když se provede, tak se celá procedura uloží do databáze a pak ji můžeš kdykoliv používat jako běžnou vestavěnou funkci. Samozřejmě je na to potřeba MySQL 5.
Ale osobně bych s tím čas neztrácel. Co jsem si kdysi hrál s levensteinem v PHP, tak mi přišlo, že pro češtinu se spíš hodí na překlepy, než na skloňování... A ani to za moc nestálo...
A počítat to pro každé jednotlivé slovo v databázi si nedokážu výkonově představit.
16. 4. 2009 06:07:16
https://webtrh.cz/diskuse/mysql-hledani-zoufaly/strana/2#reply281691
Pro odpověď se přihlašte.
Přihlásit