Vytvořte tři fulltextové indexy
- a) jeden ve sloupci klíčových slov
- b) jeden ve sloupci obsahu
- c) jeden ve sloupci klíčových slov i obsahu
Poté váš dotaz:
SELECT id, keyword, content,
MATCH (keyword) AGAINST ('watermelon') AS rel1,
MATCH (content) AGAINST ('watermelon') AS rel2
FROM table
WHERE MATCH (keyword,content) AGAINST ('watermelon')
ORDER BY (rel1*1.5)+(rel2) DESC
Jde o to, že rel1
vám dává relevanci vašeho dotazu pouze v keyword
sloupec (protože jste index vytvořili pouze na tomto sloupci). rel2
dělá totéž, ale pro content
sloupec. Nyní můžete tato dvě skóre relevance sečíst a použít libovolnou váhu.
Pro skutečné vyhledávání však nepoužíváte žádný z těchto dvou indexů. K tomu použijete svůj třetí index, který je v obou sloupcích.
Index na (klíčové slovo, obsah) řídí vaše vyvolání. Ano, co je vráceno.
Dva samostatné indexy (jeden pouze pro klíčové slovo, jeden pouze pro obsah) řídí vaši relevanci. A zde můžete použít vlastní váhová kritéria.
Všimněte si, že můžete použít libovolný počet různých indexů (nebo změnit indexy a vážení, které používáte v době dotazu, na základě jiných faktorů, možná ... hledat pouze podle klíčového slova, pokud dotaz obsahuje zastavovací slovo ... snížit zkreslení vážení pro klíčová slova, pokud dotaz obsahuje více než 3 slova ... atd.).
Každý index zabírá místo na disku, takže více indexů, více disku. A zase vyšší paměťová náročnost pro mysql. Také vkládání bude trvat déle, protože máte k aktualizaci více indexů.
Měli byste porovnávat výkon (dávejte pozor, abyste vypnuli mezipaměť dotazů mysql pro srovnávání, jinak budou vaše výsledky zkreslené) pro vaši situaci. Toto není efektivní pro hodnocení Google, ale je to docela snadné a „z krabice“ a je to téměř jistě mnohem lepší než vaše použití „like“ v dotazech.
Zjistil jsem, že to funguje opravdu dobře.