RSS: Vše - Programování



Řadíme a vyhledáváme česky

06. 11. 2007, 20:49:42,Programování,

Řazení a fulltextové vyhledávání zcela určitě patří mezi nejčastěji řešené problémy při vývoji webových stránek. Ani jedna úloha není sama o sobě nijak složitá, ale český jazyk a jeho specifická pravidla posouvají obtížnost řešení o dost více nahoru. Jak se tedy v češtině správně řadí? A jak toho docílit?

Základem tohoto článku jsou informace, které zveřejnil na našem firemním intranetu můj kolega Pavel Jeřábek, a ty, které jsem se dočetl na wiki.

Jak se tedy v češtině správně řadí?

Chtělo by se říci - co je na tom? Českou abecedu jsme se přece všichni učili ve škole, takže víme jak jdou písmenka za sebou. A pak už na tom není nic těžkého. Jenže ouha, česká abeceda definovaná normou ČSN 97 6030 z roku 1994 se skládá z následujících 31 znaků:

A B C Č D E F G H Ch I J K L M N O P Q R Ř S Š T U V W X Y Z Ž

Takže, ač v abecedě většina znaků s diakritikou zůstala, netýká se to úplně všech. Znaky Ď, Ť a Ň momentálně nejsou považovány za plnohodnotné (podobně jako např. Ě, Í, Á, Ý atp.), nemají své vlastní pořadí v abecedě a tudíž by měly být řazeny na stejná místa jako znaky, z kterých vzešly. Kupříkladu k Ň bychom se tedy měli chovat naprosto stejně jako k N. Při řazení se vůbec nebere ohled na malá a velká písmena (slova lišící se jen velikostí písmen mohou být v libovolném vzájemném pořadí), což je zjednodušení oproti předchozí normě (která malá písmena řadila před velká). Číslice se řadí za všemi písmeny, přičemž se řadí podle své číselné hodnoty.

Jak správně (fulltextově) vyhledávat?

Specifickým požadavkem na fulltextové (nebo jiné podobné) vyhledávání je v naprosté většině případů to, aby se nebral ohled na jakoukoliv diakritiku a velikost písmen. V tomto případě tedy například znaky č,c,Č a C považujeme za identické.

MySQL

Svá data většinou získáváme přímo od databázového stroje a přáli bychom si, aby nám je zaslala už rovnou seřazená. MySQL naštěstí zná pravidla českého pravopisu dobře a postačí, když nastavíme collate na utf8_czech_ci, tj. české, case insensitive (bez ohledu na velikost písmen), řazení.

Pokud ovšem máme data v databázi uložená s tímto collate, bude se implicitně používat i při fulltextovém vyhledávání. Na to ovšem máme zcela jiné požadavky (viz. předchozí odstavec). Řešením je vnutit při vyhledávácím dotazu MySQL collate jinou - a přímo se nabízí anglická, která diakritické znaky ignoruje. Stačí pak tedy napsat:

SELECT * FROM clanky WHERE telo COLLATE utf8_general_ci LIKE "%priroda%";

Autor: Pavel Šindelka

Komentáře


[1] (Corwin) - 07. 11. 2007, 22:55:12
Juu *18*

Tohle se mi bude hodit, díky :)

Komentovat


Tento článek byl uzavřen. Už není možné k němu přidávat komentáře ani hlasovat