В этом руководстве я опишу создание полнотекстового поиска в Laravel 4.
Те из вас, кто работал с Laravel 3, могут вспомнить, что в нем была поддержка FULLTEXT-индексов. Эта функциональность была удалена из Laravel 4, но по-прежнему может быть легко реализована.
Однако имейте в виду, что полнотекстовый поиск совместим не с каждым сервером баз данных, или может работать с ними по-разному. Это стало главной причиной его удаления из Laravel 4. Но если вы работаете с MySQL, то вы можете использовать такой поиск без проблем!
Что надо знать о полнотекстовом поиске
MySQL поддерживает полнотекстовое индексирование и поиск:
- Полнотекстовый индекс в MySQL — это индекс типа FULLTEXT.
- Полнотекстовые индексы могут использоваться только с таблицами MyISAM. (А в MySQL 5.6 и выше они также могут использоваться с таблицами InnoDB). Полнотекстовые индексы могут быть созданы только для столбцов CHAR, VARCHAR или TEXT.
- Описание FULLTEXT-индекса может быть дано в операторе CREATE TABLE, когда таблица создается, или добавлено позднее с помощью ALTER TABLE или CREATE INDEX.
- Для больших наборов данных намного быстрее загрузить данные в таблицу, у которой нет FULLTEXT индекса, и после этого создать индекс, чем загружать данные в таблицу, у которой уже есть FULLTEXT индекс.
Как использовать полнотекстовый поиск в Laravel
Для того чтобы начать применять полнотекстовый поиск в Laravel 4, мы позаботимся о нескольких вещах:
- Если вы используете не MySQL 5.6+, мы должны выбрать в качестве движка базы данных MyISAM вместо InnoDB.
- Мы должны настроить миграцию и добавить полнотекстовый индекс.
- Мы должны добавить функцию поиска в наш контроллер.
Миграция нашей таблицы
Миграция нашей таблицы проста. Мы можем использовать следующую схему для задания столбцов title и body в качестве FULLTEXT-индекса таблицы posts:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
class CreatePostsTable extends Migration {
/**
* Запуск миграций.
*
* @return void
*/
public function up()
{
Schema::create('posts', function(Blueprint $table) {
$table->engine = 'MyISAM'; // внимание: вы не сможете использовать внешние ключи (foreign keys)
$table->increments('id');
$table->string('title');
$table->text('body');
$table->timestamps();
});
DB::statement('ALTER TABLE posts ADD FULLTEXT search(title, body)');
}
/**
* Откат миграций.
*
* @return void
*/
public function down()
{
Schema::table('posts', function($table) {
$table->dropIndex('search');
});
Schema::drop('posts');
}
}
В приведенном коде вы можете увидеть, что мы также выбрали движок хранилища MyISAM в миграции.
Индекс FULLTEXT задан после создания таблицы с помощью оператора ALTER TABLE.
В функции down() мы сначала удаляем полнотекстовый индекс, а затем удаляем таблицу.
Добавление функции поиска в наш контроллер
Дальше нам надо добавить функцию поиска в наш контроллер. Для этого мы будем использовать запрос POST. Назовем функцию postSearch, чтобы обращаться к ней соответственно.
public function postSearch()
{
$q = Input::get('query');
$posts = $this->post->whereRaw(
"MATCH(title,body) AGAINST(? IN BOOLEAN MODE)",
array($q)
)->get();
return View::make('posts.index', compact('posts'));
}
Теперь, например, если параметр вашего запроса будет «testing», вы получите следующий MySQL-запрос:
sqlSELECT * FROM `posts` WHERE MATCH(title,body) AGAINST('testing' IN BOOLEAN MODE);
В этом примере я также беру результат и передаю его в мое представление index. Вы точно также можете использовать другое представление.
Добавление маршрута и изменение представления
Route::post(
'posts/search',
array(
'as' => 'posts.search',
'uses' => 'PostsController@postSearch'
)
);
И мы можем создать простую форму в представлении так:
xml<div class="search"> {{ Form::model(null, array('route' => array('posts.search'))) }} {{ Form::text('query', null, array( 'placeholder' => 'Search query...' )) }} {{ Form::submit('Search') }} {{ Form::close() }} </div>
Все, что нам для этого нужно, это текстовое поле с параметром name, с установленным значением query (или любой, который вы решили выбрать в качестве входного имени в вашем контроллере).
Вот и всё!
Теперь вы знаете, как применять полнотекстовый поиск MySQL в Laravel 4.
Если вам понравилось это руководство, обязательно поделитесь им в социальных сетях.
Не стесняйтесь оставлять отзывы или вопросы в комментариях.