Полнотекстовый поиск с Laravel и Postgresql - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь выполнить полнотекстовый поиск, но застрял в ошибке.

Миграция:

public function up()
{
    Schema::create('lkp_answers', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        //code...
    });

    DB::statement("ALTER TABLE lkp_answers ADD COLUMN searchtext TSVECTOR");
    DB::statement("UPDATE lkp_answers SET searchtext = to_tsvector('english', name )");
    DB::statement("CREATE INDEX searchtext_gin ON lkp_answers USING GIN(searchtext)");
    DB::statement("CREATE TRIGGER ts_searchtext BEFORE INSERT OR UPDATE ON lkp_answers FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('searchtext', 'pg_catalog.english', 'name')");
}

public function down()
{
    DB::statement("DROP TRIGGER IF EXISTS tsvector_update_trigger ON lkp_answers");
    DB::statement("DROP INDEX IF EXISTS searchtext_gin");
    DB::statement("ALTER TABLE lkp_answers DROP COLUMN searchtext");
    Schema::dropIfExists('lkp_answers');
}

Модель

class LkpAnswer extends Model
{
    public function scopeSearch($query, $search)
    {
        if (!$search) {
            return $query;
        }
        return $query->whereRaw('searchtext @@ to_tsquery(\'english\', ?)', [$search])
            ->orderByRaw('ts_rank(searchtext, to_tsquery(\'english\', ?)) DESC', [$search]);
    }
}

Контроллер

$title = 'RETENTION OF TITLE';
$topics = LkpAnswer::search($title)->get();

Ошибка:

SQLSTATE [42601]: синтаксическая ошибка: 7 ОШИБКА: синтаксическая ошибка в tsquery: "RETENTION OF TITLE" (SQL: выберите * из "lkp_answers", где searchtext @@ to_tsquery ('engli sh', RETENTION OF TITLE) упорядочено по ts_rank (searchtext, to_tsquery (') engli sh ', УДЕРЖАНИЕ НАЗВАНИЯ)) DES C) "

1 Ответ

0 голосов
/ 24 марта 2020

Я узнал ответ. В контроллере я должен заменить to_tsquery на plainto_tsquery, и это работает. Поскольку я использую строку из приложения, лучше использовать plainto_tsquery, потому что она принимает простую строку и предполагает, что это не операция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...