Autor Zpráva
Petr-K
Profil *
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
Petr-K:
Jak byste mi doporučili pokračovat nebo řešit situaci?

Změřte si rychlost nad očekávanými daty.

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:

0