Zadejte hledaný výraz...

MySQL – víceslovné hledání

mcever4
verified
rating uzivatele
11. 7. 2022 11:35:00
Zdravím, chtěl jsem se zeptat, zda existuje lepší způsob než ten, který používám. 
Jedná se o vyhledávání ve více sloupcích řetězcem, který má více slov
uvedu na příkladu:
Tabulka: id, znacka, model, rok, 
Data: 457, Mercedes-Benz, Třída E, 2022 
Vyhledávací formulářové pole:  mercedes E 2022
slova pak rozdělím do pole
SQL:
11. 7. 2022 11:35:00
https://webtrh.cz/diskuse/mysql-viceslovne-hledani#reply1504510
skorozacatecnik
verified
rating uzivatele
11. 7. 2022 13:57:27
Zkus se mrknout na fulltext search a MATCH AGAINST, ten jde nad více sloupci, které se zahrnou do jednoho indexu. Při boolean mode se dá používat místo procent (%) hvězdička (*) a další operátory (merc* pak najde mercedes, mercedesu, ...). Je to mnohem rychlejší, než klasický LIKE.
Viz:
https://mariadb.com/kb/en/full-text-index-overview/
Pozor na krátká slova, musí se nastavit, aby to bralo i < 3 znaky a zakázat ignorování krátkých slov jako "or", "a", a pod.
Jednoduchý příklad:
SELECT * FROM auta WHERE MATCH(znacka, model, rok) AGAINST('mercedes E 2022');
S klasickým LIKE se to musí ošetřit "ručně" v SQL, každý slopec zvlášť.
Je dobré si na to udělat samostatnou fulltextovou tabulku, kde jsou jen texty a k ní si podle "id" natahnout doplňující data z hlavní tabulky. Je mnohem rychlejší vyhledávat v jednom FT sloupci, než ve třech. Dá se ale obojí.
11. 7. 2022 13:57:27
https://webtrh.cz/diskuse/mysql-viceslovne-hledani#reply1504509
mcever4
verified
rating uzivatele
11. 7. 2022 14:24:11
Napsal skorozacatecnik;1647902
Zkus se mrknout na fulltext search a MATCH AGAINST, ten jde nad více sloupci, které se zahrnou do jednoho indexu. Při boolean mode se dá používat místo procent (%) hvězdička (*) a další operátory (merc* pak najde mercedes, mercedesu, ...). Je to mnohem rychlejší, než klasický LIKE.
Viz:
https://mariadb.com/kb/en/full-text-index-overview/
Pozor na krátká slova, musí se nastavit, aby to bralo i < 3 znaky a zakázat ignorování krátkých slov jako "or", "a", a pod.
Jednoduchý příklad:
SELECT * FROM auta WHERE MATCH(znacka, model, rok) AGAINST('mercedes E 2022');
S klasickým LIKE se to musí ošetřit "ručně" v SQL, každý slopec zvlášť.
Je dobré si na to udělat samostatnou fulltextovou tabulku, kde jsou jen texty a k ní si podle "id" natahnout doplňující data z hlavní tabulky. Je mnohem rychlejší vyhledávat v jednom FT sloupci, než ve třech. Dá se ale obojí.
Jdu vyzkoušet. Krátká slova budou asi problém, neboť  Mazda 5, BMW 3,  ale to mi dělá problém i předchozí řešení.  Dík moc
11. 7. 2022 14:24:11
https://webtrh.cz/diskuse/mysql-viceslovne-hledani#reply1504508
mickjoff
verified
rating uzivatele
14. 7. 2022 07:18:20
I agree with you, thank you for sharing.
voip phone system
14. 7. 2022 07:18:20
https://webtrh.cz/diskuse/mysql-viceslovne-hledani#reply1504507
exander
verified
rating uzivatele
(2 hodnocení)
7. 8. 2022 01:01:09
Napsal mcever4;1647892
Zdravím, chtěl jsem se zeptat, zda existuje lepší způsob než ten, který používám. 
Jedná se o vyhledávání ve více sloupcích řetězcem, který má více slov
uvedu na příkladu:
Tabulka: id, znacka, model, rok, 
Data: 457, Mercedes-Benz, Třída E, 2022 
Vyhledávací formulářové pole:  mercedes E 2022
slova pak rozdělím do pole
SQL:
Použít něco jako Elastic Search, MySQL databáze na něco takové není vůbec určena.
7. 8. 2022 01:01:09
https://webtrh.cz/diskuse/mysql-viceslovne-hledani#reply1504506
crs
verified
rating uzivatele
(1 hodnocení)
5. 9. 2022 03:49:20
Můžu se v souvislosti s tím zeptat zkušenějších na metodu, kdy si v tabulce vytvořím extra sloupeček, do kterého (programaticky nebo přes triggery) při změně řádku vložím všechen obsah, ve kterém se může vyhledávat (např. název, popis, rok výroby), nastavím nad ním index a pak hledám jen v něm? Zkoušel ji někdo? S jakým výsledkem?
5. 9. 2022 03:49:20
https://webtrh.cz/diskuse/mysql-viceslovne-hledani#reply1504505
TomasX
verified
rating uzivatele
(4 hodnocení)
5. 9. 2022 08:44:25
Napsal crs;1650529
Můžu se v souvislosti s tím zeptat zkušenějších na metodu, kdy si v tabulce vytvořím extra sloupeček, do kterého (programaticky nebo přes triggery) při změně řádku vložím všechen obsah, ve kterém se může vyhledávat (např. název, popis, rok výroby), nastavím nad ním index a pak hledám jen v něm? Zkoušel ji někdo? S jakým výsledkem?
ano, je to vhodný a mnou doporučený řešení, hledat přes OR je drahé, stejně tak řídit viditelnost produktů přes flagy nebo data zveřejnění. Než sloupeček je často lepší využít jinou tabulku (zejména kvůli velikosti řádku, fragmentaci a možnosti jí snadno přegenerovat a ladit). Stejně tak je vhodné text k vyhledávání dopředu připravit, odstranit výrazy, které nechceš hledat (spojky, nesouvisející čísla a označení) nebo upravit některé výrazny na jednotný tvar atd.
5. 9. 2022 08:44:25
https://webtrh.cz/diskuse/mysql-viceslovne-hledani#reply1504504
Pro odpověď se přihlašte.
Přihlásit