Autor | Zpráva | ||
---|---|---|---|
Petr-K Profil * |
#1 · Zasláno: 2. 3. 2012, 18:16:56
Ahoj,
chtěl bych se zeptat, jak náročné je FULLTEXTové vyhledávání v MySQL. Pokusil jsem se vytvořit vyhledávání nad několika sloupci (celkem 6 = různé typy popisu předmětu), kterým jsem potřeboval přiřadit váhu, podle jeho důležitosti a také podle toho zda se nacházejí v přesném tvaru a nebo s nějakou koncovkou. Váhu hledaných slov jsem nechtěl zadávat, protože slova se odesílají z formuláře, tudíž nemohu ovlivnit co uživatel zadá, tudíž jsem zkoušel váhu přenést na sloupce (jak už jsem zmínil): SELECT o.`name`, od.`description`, ( MATCH(o.`name`) AGAINST ('maly pes' COLLATE utf8_general_ci IN BOOLEAN MODE) + 0.8*MATCH(od.`description `, od.`description_2`) AGAINST ('maly pes' COLLATE utf8_general_ci IN BOOLEAN MODE) + 0.4*MATCH(od.`description_3`, od.`description_4`, od.`description_5`) AGAINST ('maly pes' COLLATE utf8_general_ci IN BOOLEAN MODE) + 0.2*MATCH(o.`name`) AGAINST ('maly* pes*' COLLATE utf8_general_ci IN BOOLEAN MODE) + 0.15*MATCH(od.`description `, od.`description_2`) AGAINST ('maly* pes*' COLLATE utf8_general_ci IN BOOLEAN MODE) + 0.1*MATCH(od.`description_3`, od.`description_4`, od.`description_5`) AGAINST ('maly* pes*' COLLATE utf8_general_ci IN BOOLEAN MODE) ) AS `relevance` FROM `object` AS o LEFT JOIN `object_description` AS od ON o.`id_object` = od.`id_object` HAVING `relevance` > 0.1 ORDER BY `relevance` DESC LIMIT 0, 30; LIMIT jsem plánoval použít kvůli stránkování, ale teď mi ale došlo, že tímto nezjistím celkový počet nalezených záznamů, které odpovídají hledaným slovům (tzn. Nemohu připravit stránky). Proto by mě zajímalo, zda je vhodné řešení použít dotaz s FULLTEXTovým vyhledáváním 2x jednou s LIMITem a jednou bez LIMITu: SELECT ( MATCH(o.`name`, od.`description `, od.`description_2`, od.`description_3`, od.`description_4`, od.`description_5`) AGAINST ('maly pes' COLLATE utf8_general_ci IN BOOLEAN MODE) + MATCH(o.`name`, od.`description `, od.`description_2`, od.`description_3`, od.`description_4`) AGAINST ('maly* pes*' COLLATE utf8_general_ci IN BOOLEAN MODE) ) AS `relevance` FROM `object` AS o LEFT JOIN `object_description` AS od ON o.`id_object` = od.`id_object` HAVING `relevance` > 0 Nebude toto řešení příliš náročné? Jak byste mi doporučili pokračovat nebo řešit situaci? Děkuji P. PS: Pro komunikaci s DB používám dibi, třeba má nějakou fci, která problém vyřeší nevím nenašel jsem. |
||
Kajman Profil |
#2 · Zasláno: 2. 3. 2012, 21:33:49
Petr-K:
„Jak byste mi doporučili pokračovat nebo řešit situaci?“ Změřte si rychlost nad očekávanými daty. |
||
Časová prodleva: 12 let
|
0