Autor | Zpráva | ||
---|---|---|---|
janka4 Profil * |
#1 · Zasláno: 13. 10. 2013, 15:23:43
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 |
#2 · Zasláno: 13. 10. 2013, 18:56:09
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 * |
#6 · Zasláno: 13. 10. 2013, 23:00:23
vdaka za vase odpovede, moje otazky:
1.) ako spravim fulltext na stlpec? 2.) a potom ako bude vyzerat ten dotaz? Vopred dakujem. |
||
Kubo2 Profil |
#7 · Zasláno: 13. 10. 2013, 23:22:09
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 * |
#8 · Zasláno: 14. 10. 2013, 00:09:49
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 |
#9 · Zasláno: 14. 10. 2013, 06:50:31
Napíšem večer, keď sa dostanem k počítaču, ak to teda nevadí.
|
||
janka4 Profil * |
#10 · Zasláno: 14. 10. 2013, 14:41:42
Kubo2:
Jasne, v pohode, tesim sa. ;-)) Ja si skusim dovtedy tiez precitat ten clanok. :) |
||
Kubo2 Profil |
#11 · Zasláno: 14. 10. 2013, 21:18:41
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; Ď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); 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 * |
#13 · Zasláno: 14. 10. 2013, 22:06:27
Mne sa osvedcil tento dotaz:
SELECT * FROM tabulka WHERE MATCH(stlpec1, stlpec2) AGAINST('slovo1 slovo2 slovo3') > 0,001 M. |
||
Časová prodleva: 10 let
|
0