Skip to main content

시작하기

Laravel ScoutEloquent 모델에 전문 검색 기능을 추가하기 위한, 심플한 드라이버 기반의 솔루션입니다. 모델 옵저버를 사용해, Eloquent 레코드와 검색 인덱스를 자동적으로 동기합니다. Scout에는, MySQL / PostgreSQL의 전문 인덱스와 LIKE 절을 사용해 데이터베이스를 직접 검색하는 조립된 database 엔진이 포함되어 있어, 외부 서비스는 불필요합니다. 대규모의 프로덕션 환경에서 오타 허용·패싯 검색·지오 서치가 필요한 경우는, 외부 엔진이 도움이 됩니다.

대응 엔진 일람

설치

Composer로 패키지를 설치합니다.
설치 후, vendor:publish 명령으로 설정 파일을 공개합니다. config/scout.php가 생성됩니다.
마지막으로, 검색 가능하게 하고 싶은 모델에 Laravel\Scout\Searchable 트레이트를 추가합니다. 이 트레이트가 모델 옵저버를 등록하고, 검색 드라이버와의 자동 동기를 활성화합니다.

큐 설정

database 또는 collection 엔진 이외를 사용하는 경우, Scout를 사용하기 전에 큐 드라이버의 설정을 강력히 권장합니다. 큐 워커를 동작시킴으로써, 인덱스 동기 조작이 백그라운드에서 실행되고, 웹 인터페이스의 응답 속도가 대폭 향상됩니다. config/scout.phpqueue 옵션을 true로 설정합니다.
접속명과 큐명을 지정할 수도 있습니다.
설정 후, 전용의 큐 워커를 기동합니다.

유니크한 잡의 사용

쓰기가 많은 애플리케이션에서는, 같은 모델 레코드에 대한 중복된 큐 잡이 큐에 등록되는 것을 막고 싶은 경우가 있습니다. config/scout.php에서 MakeSearchableUniquelyRemoveFromSearchUniquely 잡 클래스를 등록함으로써, 유니크한 인덱스 잡을 사용할 수 있습니다. 통상, 이것은 서비스 프로바이더의 boot 메서드에서 설정합니다.
이러한 잡은 Laravel의 유니크한 잡 락을 사용해, 이미 큐에 등록되어 있는 같은 모델 레코드의 중복된 인덱스 조작을 디스패치하는 것을 막습니다.

드라이버의 전제 조건

Algolia

Algolia 드라이버를 사용하는 경우는, config/scout.phpidsecret의 인증 정보를 설정하고, Algolia PHP SDK를 설치합니다.
.env 파일에 인증 정보를 추가합니다.

인덱스 설정

Algolia에서는 config/scout.php에서 인덱스 설정을 관리할 수 있습니다.
설정 후, scout:sync-index-settings 명령을 실행해 Algolia에 설정을 반영시킵니다.

Meilisearch

Meilisearch는 고속의 오픈 소스 검색 엔진입니다. 로컬 개발에서는 Laravel Sail의 Docker를 사용하는 것이 가장 간단합니다.
Sail을 사용하지 않는 경우는, Docker로 직접 기동할 수 있습니다.
Meilisearch PHP SDK를 설치합니다.
.env 파일에 드라이버와 호스트를 설정합니다.
Scout를 업그레이드할 때는, Meilisearch 서비스 자체의 파괴적 변경도 반드시 확인해 주세요.

인덱스 설정 (Meilisearch)

Meilisearch에서는 where()로 필터링하는 컬럼을 filterableAttributes에, orderBy()로 정렬하는 컬럼을 sortableAttributes에 사전 등록할 필요가 있습니다.
수치 컬럼의 데이터 타입에 주의가 필요합니다. Meilisearch는 올바른 타입의 데이터에만 필터 조작(>, < 등)을 실행할 수 있습니다.
설정 후, scout:sync-index-settings 명령을 실행합니다.

시맨틱 검색과 하이브리드 검색 (Meilisearch)

Meilisearch에서 시맨틱 검색 또는 하이브리드 검색을 사용하려면, 인덱스 설정에서 embedder를, 모델 설정에서 임베딩 정보를 지정합니다.
모델의 toSearchableEmbedding 메서드는, Laravel AI SDK로 임베딩할 원본 텍스트, 또는 사전 계산된 임베딩 배열을 반환합니다. 설정 후에는 scout:sync-index-settings를 실행해 주세요.

Typesense

Typesense는 고속의 오픈 소스 검색 엔진으로, 키워드 검색·시맨틱 검색·지오 검색·벡터 검색에 대응하고 있습니다.
.env 파일에 접속 정보를 설정합니다.
Typesense를 사용하는 경우, toSearchableArray 메서드로 모델의 주 키를 문자열로, 작성 일시를 UNIX 타임스탬프로 캐스트할 필요가 있습니다.

시맨틱 검색과 하이브리드 검색 (Typesense)

Typesense에서 시맨틱 검색·하이브리드 검색을 유효화하려면, 모델의 Typesense 설정에서 embedding 설정과 벡터 필드를 정의합니다. 기본적으로 Scout는 Laravel AI SDK를 사용해 임베딩을 생성합니다.
모델의 toSearchableEmbedding 메서드는, Scout가 임베딩할 원본 텍스트, 또는 사전 계산된 임베딩 배열을 반환합니다.
Typesense의 네이티브 임베딩 기능을 사용하는 경우는, Laravel AI SDK 없이도 임베딩을 생성할 수 있습니다. 자세한 내용은 Typesense 공식 문서를 참조해 주세요.

Turbopuffer

Turbopuffer는 전문·시맨틱·하이브리드 검색을 지원하는 검색 엔진입니다. Turbopuffer 드라이버를 사용하려면, SCOUT_DRIVER와 API 키를 설정합니다.
TURBOPUFFER_REGION은 생략 가능하며, 기본값은 gcp-us-central1입니다.

데이터베이스 / 컬렉션 엔진

외부 서비스 없이 검색을 추가하고 싶은 경우에 최적의 옵션입니다. 데이터베이스 엔진은 MySQL / PostgreSQL의 전문 인덱스와 LIKE 절을 사용합니다. 대부분의 애플리케이션에서 이것으로 충분합니다.

시맨틱 검색과 하이브리드 검색

데이터베이스 엔진은, pgvector 확장을 활성화한 PostgreSQL에서 시맨틱 검색과 하이브리드 검색을 지원합니다. 모델의 테이블에 nullable한 벡터 컬럼과 전문 인덱스를 추가합니다. Scout는 모델 저장 후에 임베딩을 저장하므로, 벡터 컬럼은 nullable로 해 주세요.
모델에 toSearchableEmbedding 메서드를 정의합니다. 이 메서드는 Scout가 임베딩할 원본 텍스트, 또는 사전 계산된 임베딩 배열을 반환합니다. 임베딩은 기본적으로 embedding 컬럼에 저장되지만, searchableEmbeddingColumn 메서드로 변경할 수 있습니다. 컬렉션 엔진은 PHP로 필터링하기 때문에, SQLite를 포함한 Laravel이 지원하는 모든 데이터베이스에서 동작합니다. 로컬 개발·테스트·소규모 데이터셋용입니다.
데이터베이스 엔진에서는 외부 엔진과 달리 인덱스의 수동 관리는 불필요합니다. 데이터베이스 테이블을 직접 검색합니다.

Turbopuffer의 설정

Turbopuffer에서는, 모델별로 검색 가능한 속성과 스키마를 config/scout.phpmodel-settings에 정의합니다.
searchable-attributes의 수치는 BM25의 상대적인 가중치입니다. 예에서는, 제목의 일치가 본문의 3배의 스코어에 기여합니다. 시맨틱 검색을 사용하는 경우는 embedding 설정과 벡터의 스키마를 추가하고, 모델의 toSearchableEmbedding 메서드에서 원본 텍스트 또는 임베딩 배열을 반환합니다.
Turbopuffer의 네이티브 임베딩을 사용하는 경우는, Laravel AI SDK나 toSearchableEmbedding은 불필요합니다. 임베딩의 원본 속성을 toSearchableArray의 반환값에 포함하고, 다음과 같이 설정합니다.

Searchable 트레이트

toSearchableArray()의 커스터마이즈

기본적으로, 모델의 toArray()의 전 데이터가 검색 인덱스에 보존됩니다. 인덱스에 동기하는 데이터를 커스터마이즈하려면, toSearchableArray 메서드를 오버라이드합니다.

인덱스명의 커스터마이즈

기본적으로, 모델의 테이블명(복수형)이 인덱스명으로서 사용됩니다. searchableAs 메서드를 오버라이드해 커스터마이즈할 수 있습니다.

데이터베이스 엔진용의 검색 전략

데이터베이스 엔진에서는, 컬럼별로 효율적인 검색 전략을 PHP 애트리뷰트로 지정할 수 있습니다.
SearchUsingFullText를 사용하기 전에, 대상 컬럼에 전문 인덱스가 부여되어 있는지 확인해 주세요.

조건부로 검색 가능하게 하기

특정한 조건하에서만 모델을 검색 가능하게 하고 싶은 경우는, shouldBeSearchable 메서드를 정의합니다.
shouldBeSearchable는 데이터베이스 엔진에서는 기능하지 않습니다. 데이터베이스 엔진에서 같은 동작을 실현하려면, where 절을 사용해 주세요.

인덱스의 관리

이 섹션의 명령은, 주로 Algolia·Meilisearch·Typesense 등의 서드파티 엔진을 사용하는 경우에 관계합니다. 데이터베이스 엔진에서는 인덱스 관리는 불필요합니다.

기존 레코드의 임포트

기존 프로젝트에 Scout를 도입하는 경우, scout:import 명령으로 기존 레코드를 인덱스에 임포트합니다.
큐를 사용해 백그라운드에서 임포트할 수도 있습니다.

인덱스의 클리어

모델의 모든 레코드를 검색 인덱스로부터 삭제하려면 scout:flush를 사용합니다.

인덱스의 일시 정지

Eloquent 조작 중에 검색 인덱스와의 동기를 일시적으로 멈추고 싶은 경우는 withoutSyncingToSearch를 사용합니다.

레코드의 수동 추가·삭제

쿼리를 사용해 모델의 컬렉션을 인덱스에 추가할 수 있습니다.
인덱스에서 레코드를 삭제하려면 unsearchable을 사용합니다.
모델을 delete하면, 인덱스에서도 자동적으로 삭제됩니다.

검색

search 메서드로 모델을 검색합니다. get을 연결해 Eloquent 모델의 컬렉션을 취득합니다.
컨트롤러나 라우트에서 직접 반환하면 JSON으로 자동 변환됩니다.
생 검색 결과가 필요한 경우는 raw 메서드를 사용합니다.

시맨틱 검색

임베딩을 설정한 database·Meilisearch·Typesense·Turbopuffer 엔진에서는, 쿼리의 의미에 근거해 레코드를 검색할 수 있습니다. 검색 쿼리에 semantic 메서드를 추가합니다. Scout가 임베딩을 생성하는 경우, 시맨틱 검색·하이브리드 검색에는 Laravel AI SDK가 필요합니다. Typesense의 네이티브 임베딩과 Turbopuffer의 네이티브 임베딩, 사전 계산된 쿼리 벡터를 사용하는 경우는 Laravel AI SDK는 불필요합니다.
지원하는 엔진에서는, 최소 유사도의 임계값도 지정할 수 있습니다.
전문 검색과 시맨틱 검색을 조합하려면 hybrid 메서드를 사용합니다. 인수로 텍스트 검색과 시맨틱 검색의 상대적인 가중치를 지정할 수 있습니다.

페이지네이션

paginate 메서드로 검색 결과를 페이지네이션할 수 있습니다. 통상의 Eloquent 쿼리의 페이지네이션과 마찬가지로 기능합니다.
데이터베이스 엔진에서는 simplePaginate도 사용할 수 있습니다. 총 건수를 취득하지 않기 때문에 대규모 데이터셋에서 효율적입니다.
Blade 템플릿에서의 표시 예:

필터링과 정렬

where 메서드로 검색 쿼리에 필터 조건을 추가할 수 있습니다.
Meilisearch를 사용하는 경우, where를 사용하기 전에 필터링 가능한 속성을 설정할 필요가 있습니다.
query 메서드로 Eloquent 쿼리를 커스터마이즈할 수도 있습니다.

Eager Loading

Scout를 사용하면, 검색 엔진으로부터 ID의 일람을 취득한 후, Eloquent로 모델을 취득합니다. N+1 문제를 피하려면, query 메서드에서 with()을 사용한 Eager Loading을 지정합니다.
배치 임포트 시에 릴레이션을 Eager Load하려면, makeAllSearchableUsing 메서드를 정의합니다.
makeAllSearchableUsing은 큐를 사용한 배치 임포트에서는 사용할 수 없는 경우가 있습니다. 큐 잡에서 모델 컬렉션이 처리될 때 릴레이션은 복원되지 않습니다.

소프트 삭제

인덱스된 모델이 소프트 삭제를 사용하고 있고, 삭제된 모델도 검색하고 싶은 경우는, config/scout.phpsoft_delete 옵션을 true로 설정합니다.
활성화하면, withTrashedonlyTrashed로 삭제된 레코드를 검색할 수 있습니다.

커스텀 엔진

조립된 검색 엔진이 니즈에 맞지 않는 경우는, 독자적인 커스텀 엔진을 구현할 수 있습니다. 커스텀 엔진은 Laravel\Scout\Engines\Engine 추상 클래스를 상속하고, 이하의 8개의 메서드를 구현해야 합니다.
구현의 참고로서, Laravel\Scout\Engines\AlgoliaEngine 클래스를 확인해 주세요. 작성한 커스텀 엔진은, App\Providers\AppServiceProviderboot 메서드에서 Scout에 등록합니다.
등록 후, config/scout.php에서 드라이버로서 지정합니다.

관련 페이지

Eloquent ORM

Eloquent 모델의 기본적인 사용법을 확인합니다.

Eloquent 릴레이션

릴레이션의 정의와 Eager Loading을 확인합니다.

Scout는 큐와 함께 인덱스를 백그라운드에서 업데이트할 수 있습니다.
마지막 수정일 2026년 9월 11일