Prosim, rad by som sa opytal na vas nazor na riesenie nasledovneho problemu:
Tabulka, cca 2 mil zaznamov, jeden z nich textovy, dlzka cca 30 az 40 znakov obsahujuca slova napr. ferko mrkvicka v katedrale.
Problem: v tomto stlpci potrebujem efektivne vyhladavat zaznamy obsahujuce zadane slova. Priklad:
Vyhladavam ferko mrkvicka kat - zaujimaju ma zaznamy obsahujuce ferko, mrkvicka a zaroven vsetky slova ktore zacinaju na kat tj. A napriklad yssie uvedena katedrala ale a katedra atd.
V klasicke databaze sa to da riesit via lika. Mna napadlo pouzit klasicku databazu, stlpec tokenizovat tj. Vytvorit slovnik vsetkych moznych slov a nasledne v relacii 1 ku N priradit pre jednotlive zaznamy idcka do slovnika tj. Pre priklad vyssie idcka vsetkych styroch slov. Nasledne vyhladavat v slovniku tj. Zistit idcka, cezmidcka zistit idcka zaznamov a tak sa dopracovatk vysledku. Avsak mozno existuje specializvana databaza o ktorej neviem ;)
Za kazdy napad budem vdacny ;)
Nejsem autor ale i tak se pokusím odpovědět ...
V podstatě asi nejlepší způsob jak to vyřešit je přes fulltext přímo v databázi - implementace závisí na konkrétní databázi, v PostgreSQL tu funguje zhruba tak že si vytvoříte konfiguraci která říká podle jakého slovníku a pravidel se má skloňovat (např. slovensky nebo vůbec), následně nad daným sloupcem vytvoříte fulltext index a pak hledáte - efektivně (přes index), můžete si nechat spočítat score apod. Popsané je to tady: http://www.postgresql.org/docs/9.1/interactive/textsearch.html
Druhou možností (pokud se mermomocí chcete držet LIKE) jsou trigramy - jednoduše každé slovo se rozloží na trojice znaků, ty se oindexují a pak se v tom dá hledat (opět celkem efektivně) - podrobnosti viz. zde: http://www.postgresql.org/docs/9.1/interactive/pgtrgm.html
Toto jsou možnosti v rámci PostgreSQL, v jiných DB to může být trochu jinak.
Vítejte do světa MySQL, kde každý storage engine implementuje jinou nekompletní sadu vlastností :-( Jedna možnost je udělat si tam duplicitní MyISAM tabulku do které se data nějak kopírují a tam už to fulltext umí. Ale je to takové "drbání pravou nohou za levým uchem".
Ale když už jsme v diskusi pod článkem o indexech v PostgreSQL, tak jsem si vzpomněl že ono LIKE jde optimalizovat i přes obyčejné b-tree indexy, je akorát potřeba správně nastavit operator class.
Každopádně jsme už hodně hodně offtopic, takže pokud nehcete migrovat na PostgreSQL tak bych tu diskusi asi přesunul jinam.