Может войдёшь?
Черновики Написать статью Профиль

Создание полнотекстового поиска в Laravel

перевод

В этом руководстве я опишу создание полнотекстового поиска в 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
<?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, чтобы обращаться к ней соответственно.

PHP
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. Вы точно также можете использовать другое представление.

Добавление маршрута и изменение представления

Мы создаём наш маршрут так:

PHP
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.
Если вам понравилось это руководство, обязательно поделитесь им в социальных сетях.
Не стесняйтесь оставлять отзывы или вопросы в комментариях.

Как вы считаете, полезен ли этот материал? Да Нет

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.