Autor Zpráva
Gandalf123
Profil *
Zdravím nevíte kde je v tomto dotazu chyba?

$queryb = "SELECT * FROM articles WHERE MATCH(title, content) AGAINST ('".$search."' IN BOOLEAN MODE) ORDER BY 4 * MATCH(content) AGAINST ('".$search."') + 1 * MATCH(title) AGAINST ('".$search."') DESC";

I když by to mělo řadit nahoru výsledky které mají hledané slovo v sloupci "content" tak to tam řadí ty které ho mají v "title"

Moderátor Alphard: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
Keeehi
Profil
Teoreticky by s tím neměl být problém.
Vypsal bych si ty hodnoty a zkontroloval, jestli mi to vrací správné výsledky. S matikou by problém být neměl.
SELECT *, (MATCH(content) AGAINST ('".$search."')) AS content_Wright, (MATCH(title) AGAINST ('".$search."')) AS title_weight
Alphard
Profil
Trošku to rozvedu (teď vycházím z předpokladu, že jde o InnoDB tabulku). Způsob výpočtu relevance popisuje manuál, tam je (velmi jednoduchý) vzorec (vysvětlení viz odkázaná stránka)
${IDF} = log10( ${total_records} / ${matching_records} ) 

Tímto způsobem se vypočítá relevance pro každý index, tedy samostatně pro sloupec title, content a jejich kombinaci. Tady jsem trochu zmanipuloval manuálový příklad, aby ukazoval to, co chci ukázat. Je zřejmé, že relavance sloupce title může být (vzhledem k ostatním záznamům) tak vysoká, že ji ani čtyřnásobek relevance obsahu nepřebije.

Ten dotaz je tedy správně, tohle je běžné MySQL řešení, ale nejsou zvoleny adekvátní váhy.
Gandalf123
Profil *
Už jsem to částečně vyřešil ale měl bych ještě jeden dotaz. Je nějak možné ohodnotit že třeba id=$search (popřípadě LIKE) je důležitější než necojineho=$search (nebo LIKE) to ještě porovnat s tím hodnocením fulltextových nálezů?
Alphard
Profil
Žádný speciální mechanismus na to není, stejně jak dosud. Výsledek porovnání se ihned konvertuje na 1/0 (MySQL afaik neumí bool, je to jen alias pro tinyint), takže stačí začlenit něco jako
3*(title = 'hledaný text') + 2*(title like '%hledaný text%')

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: