Autor Zpráva
janka4
Profil *
Ahojte,

prosim vas, ako mozem vyhladat nejake slovo v tabulke, t.j. LIKE '%slovo%' upravit tak, aby to bolo slovo (nezalezi na velkosti pismen), t.j.

spravne:
Aaaa slovo.
aaaa slovo bbb
Slovo bbbb.
slovo: aaa
slovo

nespravne:
slovobezmedzery
vstredeslovoaaa

Asi chapete, co mam namysli. v PHP je na to v regex \b, ale tu to asi bude fungovat nejako inak.

Vopred dakujem velmi pekne.
Tori
Profil
Chcete-li používat reguláry/LIKE, napadají mne 3 možnosti:
a) regulár v dotazu: SELECT ... WHERE sloupec REGEXP '[[:<:]]slovo[[:>:]]'; (ty podivné sekvence okolo jsou totéž co \b, viz manuál, koukněte se hlavně na poznámku o vícebajtových znak.sadách a rozlišování velikosti písmen).
b) 3x LIKE pro všechny možné varianty
c) ponechat tento LIKE %slovo%, v PHP kontrolovat regulárem a nevyhovující řádky zahazovat.
Porovnejte si rychlost na dostatečně velkém vzorku dat, konkrétně tedy rychlost SQL dotazu u a) vs. b), a celkovou rychlost včetně PHP spuštění dotazu a načtení všech požadovaných výsledků do pole u b) vs. c). Z hlavy to neodhadnu, co by bylo lepší.

Nicméně nejjednodušší (a hlavně nejrychlejší) řešení by bylo přidat na ten sloupec fulltext.index a hledat fulltextem.
Kubo2
Profil
Tori:
ponechat tento LIKE %slovo%, v PHP kontrolovat regulárem a nevyhovující řádky zahazovat
To je zbytočne veľký prietok dát a spomaľovanie behu aplikácie.
Napadlo ma (nejdem to teraz testovať, ale logicky si myslím, že by to malo ísť), ak chcete hľadať slovo uprostred vety, či by sa nedalo použiť LIKE '% slovo %'?
Tori
Profil
Hledané slovo může být i na začátku nebo na konci, proto tři různé možnosti v b). Osobně bych použila fulltext.
Kubo2
Profil
[#4] Tori
Jasně.
janka4
Profil *
vdaka za vase odpovede, moje otazky:

1.) ako spravim fulltext na stlpec?
2.) a potom ako bude vyzerat ten dotaz?

Vopred dakujem.
Kubo2
Profil
janka4:
To sa všetko dozvieš, ak si prečítaš stránku, na ktorú ťa odkázala Tori. Teraz som strávil pol hodinu svojho času čítaním danej stránky o fulltexte a musím povedať, že sa to fakt oplatilo :-)
janka4
Profil *
Kubo2:
akoze toto http://dev.mysql.com/doc/refman/5.1/en/fulltext-natural-language.html?

A co si sa take zaujimave dozvedel? :))
Kubo2
Profil
Napíšem večer, keď sa dostanem k počítaču, ak to teda nevadí.
janka4
Profil *
Kubo2:
Jasne, v pohode, tesim sa. ;-)) Ja si skusim dovtedy tiez precitat ten clanok. :)
Kubo2
Profil
janka4:
1.) ako spravim fulltext na stlpec?
V dokumentácií (na odkázanej stránke) píšu tento príklad - máš tabuľku articles(`id`, `title`, `body`):
mysql> CREATE TABLE articles (
    ->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->   title VARCHAR(200),
    ->   body TEXT,
    ->   FULLTEXT (title,body)
    -> ) ENGINE=MyISAM;
Fulltext Index si v tomto prípade urobili na dvoch stĺpcoch naraz (neviem presne ako to s tými indexmi funguje, ale vyzerá to zaujímavo), a to title a body.
Ďalej si do tabuľky vložili dáta (viď. dokumentáciu, budem používať dáta odtiaľ).

2.) a potom ako bude vyzerat ten dotaz?
Napríklad takto:
mysql> SELECT * FROM articles
    -> WHERE MATCH (title,body)
    -> AGAINST ('database' IN NATURAL LANGUAGE MODE);
(Opäť som nepochopil jendu vec, a to modifikátor IN NATURAL LANGUAGE MODE.)
Tento dotaz ti vráti dva riadky, zoradené podľa hodnoty relevancie daného slova (daných slov) v INDEXe, ktorú vráti funkcia MATCH().
Ak chceš hľadať podľa viacerých slov, jednoducho napíšeš (ako keď píšeš do vyhľadávača):
... AGAINST ('mysql database tricks' IN NATURAL LANGUAGE MODE);.
!-Fulltext defaultne hľadá bez rozlišovania veľkosti písmen.

Ďalej tam píšu, že ak je nejaké slovo obsiahnuté vo viac ako 50-tich %-ách riadkov danej tabuľky, považuje sa za tzv. stopword - niečo ako veľmi časté slovo, ktoré v podstate získava nulovú relevanciu pri hľadaní aj radení výsledkov.
Z toho logicky vyplýva, že ak chceš hľadať fulltextom, tak musíš mať v tabuľke minimálne tri riadky.

Píšu tam toho ešte oveľa viac, je to veľmi zaujímavé, takže odporúčam prečítať - napríklad čo sa považuje za slovo a čo nie, ako vyhľadávať a brať pri tom ohľad na veľkosť písmen, a iné veci :-)

Ale kebyže to mám zhrnúť do tohoto príspevku, to by som mohol skôr urobiť prekladový článok :-)
Tori
Profil
- To "IN NATURAL LANGUAGE MODE" je výchozí, není nutné uvádět. Vyhledává jen celá slova. U booleovského vyhledávání můžete používat navíc různé modifikátory pro naznačení důležitosti jednotlivých hledaných slov ("Chci všechno, kde je slovo1+slovo2; pokud obsahují i slovo3, tak ty zobraz nejdřív. Nechci nic, co obsahuje slovo4.") a/nebo zástupné znaky.
- Indexy můžou být na jednom nebo více sloupcích, podle toho, co je potřeba. Když víte, že budete vyhledávat v obou sloupcích, dejte index přes oba.
Monkeys
Profil *
Mne sa osvedcil tento dotaz:

SELECT * FROM tabulka WHERE MATCH(stlpec1, stlpec2) AGAINST('slovo1 slovo2 slovo3') > 0,001
MATCH ... > 0,001 vyluci z vyhladavania tie polozky u nich vracia MATCH priliz male hodnoty.

M.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: