A full-text index needed raw SQL in a migration until 9.0, which meant it was invisible to anything reading the schema definition.
Schema::table('products', function (Blueprint $table) {
$table->fullText(['name', 'description']);
});
// and the query side
Product::whereFullText(['name', 'description'], 'desk lamp')->get();
// which generates MATCH ... AGAINST in natural language
// mode. boolean mode needs the mode option.
Natural language mode is the default and has a fifty per cent threshold that surprises everybody: a term appearing in more than half the rows is treated as a stopword and matches nothing. Boolean mode has no such rule and no relevance ranking worth the name, so the choice is between a ranking that silently drops common words and no ranking at all.