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 |
#2 · Zasláno: 8. 1. 2016, 20:32:27
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 |
#3 · Zasláno: 8. 1. 2016, 21:08:26
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 * |
#4 · Zasláno: 8. 1. 2016, 23:21:56
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 |
#5 · Zasláno: 8. 1. 2016, 23:54:19
Žá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%') |
||
Časová prodleva: 9 let
|
0