2014-11-14 7 views
0

Я использую Postgres 9.3 Вт/Laravel 5 и я настроил следующую миграцию:Postgres полнотекстовый поиск по нескольким столбцам

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

Если у меня есть запись с именем «Христофор», и я выполнить следующий запрос я получаю никаких результатов

return User::whereRaw("searchtext @@ to_tsquery('Chris')")->get(); 

Если я ищу «Христофор» Я получаю запись. Что мне нужно сделать, чтобы иметь возможность искать с частичным совпадением?

ответ

1

Словарь english не вызывает прозвища.

regress=> SELECT to_tsvector('english', 'Christopher'), to_tsquery('english', 'Chris'); 
    to_tsvector | to_tsquery 
---------------+------------ 
'christoph':1 | 'chris' 
(1 row) 

Вам нужно наложить словарь, который отображает прозвища тоже, так что christopher может быть стеблями в chris.