Full-text indexes in the schema builder

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.