sql >> Databáze >  >> RDS >> Mysql

Jak mohu manipulovat s relevanci fulltextového vyhledávání MySQL, aby bylo jedno pole „hodnotnější“ než jiné?

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.



  1. Simulovat VYTVOŘIT DATABÁZI, POKUD NEEXISTUJE pro PostgreSQL?

  2. Použití poddotazu v příkazu Check v Oracle

  3. Migrace z MySQL Enterprise na MariaDB 10.3

  4. Použití funkcí okna v příkazu aktualizace