시작하기
Laravel Scout는 Eloquent 모델에 전문 검색 기능을 추가하기 위한, 심플한 드라이버 기반의 솔루션입니다. 모델 옵저버를 사용해, Eloquent 레코드와 검색 인덱스를 자동적으로 동기합니다. Scout에는, MySQL / PostgreSQL의 전문 인덱스와LIKE 절을 사용해 데이터베이스를 직접 검색하는 조립된 database 엔진이 포함되어 있어, 외부 서비스는 불필요합니다. 대규모의 프로덕션 환경에서 오타 허용·패싯 검색·지오 서치가 필요한 경우는, 외부 엔진이 도움이 됩니다.
대응 엔진 일람
설치
Composer로 패키지를 설치합니다.vendor:publish 명령으로 설정 파일을 공개합니다. config/scout.php가 생성됩니다.
Laravel\Scout\Searchable 트레이트를 추가합니다. 이 트레이트가 모델 옵저버를 등록하고, 검색 드라이버와의 자동 동기를 활성화합니다.
큐 설정
database 또는 collection 엔진 이외를 사용하는 경우, Scout를 사용하기 전에 큐 드라이버의 설정을 강력히 권장합니다. 큐 워커를 동작시킴으로써, 인덱스 동기 조작이 백그라운드에서 실행되고, 웹 인터페이스의 응답 속도가 대폭 향상됩니다.
config/scout.php의 queue 옵션을 true로 설정합니다.
유니크한 잡의 사용
쓰기가 많은 애플리케이션에서는, 같은 모델 레코드에 대한 중복된 큐 잡이 큐에 등록되는 것을 막고 싶은 경우가 있습니다.config/scout.php에서 MakeSearchableUniquely와 RemoveFromSearchUniquely 잡 클래스를 등록함으로써, 유니크한 인덱스 잡을 사용할 수 있습니다. 통상, 이것은 서비스 프로바이더의 boot 메서드에서 설정합니다.
드라이버의 전제 조건
Algolia
Algolia 드라이버를 사용하는 경우는,config/scout.php에 id와 secret의 인증 정보를 설정하고, Algolia PHP SDK를 설치합니다.
.env 파일에 인증 정보를 추가합니다.
인덱스 설정
Algolia에서는config/scout.php에서 인덱스 설정을 관리할 수 있습니다.
scout:sync-index-settings 명령을 실행해 Algolia에 설정을 반영시킵니다.
Meilisearch
Meilisearch는 고속의 오픈 소스 검색 엔진입니다. 로컬 개발에서는 Laravel Sail의 Docker를 사용하는 것이 가장 간단합니다..env 파일에 드라이버와 호스트를 설정합니다.
인덱스 설정 (Meilisearch)
Meilisearch에서는where()로 필터링하는 컬럼을 filterableAttributes에, orderBy()로 정렬하는 컬럼을 sortableAttributes에 사전 등록할 필요가 있습니다.
>, < 등)을 실행할 수 있습니다.
scout:sync-index-settings 명령을 실행합니다.
시맨틱 검색과 하이브리드 검색 (Meilisearch)
Meilisearch에서 시맨틱 검색 또는 하이브리드 검색을 사용하려면, 인덱스 설정에서 embedder를, 모델 설정에서 임베딩 정보를 지정합니다.toSearchableEmbedding 메서드는, Laravel AI SDK로 임베딩할 원본 텍스트, 또는 사전 계산된 임베딩 배열을 반환합니다. 설정 후에는 scout:sync-index-settings를 실행해 주세요.
Typesense
Typesense는 고속의 오픈 소스 검색 엔진으로, 키워드 검색·시맨틱 검색·지오 검색·벡터 검색에 대응하고 있습니다..env 파일에 접속 정보를 설정합니다.
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.php의 model-settings에 정의합니다.
searchable-attributes의 수치는 BM25의 상대적인 가중치입니다. 예에서는, 제목의 일치가 본문의 3배의 스코어에 기여합니다. 시맨틱 검색을 사용하는 경우는 embedding 설정과 벡터의 스키마를 추가하고, 모델의 toSearchableEmbedding 메서드에서 원본 텍스트 또는 임베딩 배열을 반환합니다.
toSearchableEmbedding은 불필요합니다. 임베딩의 원본 속성을 toSearchableArray의 반환값에 포함하고, 다음과 같이 설정합니다.
Searchable 트레이트
toSearchableArray()의 커스터마이즈
기본적으로, 모델의toArray()의 전 데이터가 검색 인덱스에 보존됩니다. 인덱스에 동기하는 데이터를 커스터마이즈하려면, toSearchableArray 메서드를 오버라이드합니다.
인덱스명의 커스터마이즈
기본적으로, 모델의 테이블명(복수형)이 인덱스명으로서 사용됩니다.searchableAs 메서드를 오버라이드해 커스터마이즈할 수 있습니다.
데이터베이스 엔진용의 검색 전략
데이터베이스 엔진에서는, 컬럼별로 효율적인 검색 전략을 PHP 애트리뷰트로 지정할 수 있습니다.조건부로 검색 가능하게 하기
특정한 조건하에서만 모델을 검색 가능하게 하고 싶은 경우는,shouldBeSearchable 메서드를 정의합니다.
인덱스의 관리
이 섹션의 명령은, 주로 Algolia·Meilisearch·Typesense 등의 서드파티 엔진을 사용하는 경우에 관계합니다. 데이터베이스 엔진에서는 인덱스 관리는 불필요합니다.
기존 레코드의 임포트
기존 프로젝트에 Scout를 도입하는 경우,scout:import 명령으로 기존 레코드를 인덱스에 임포트합니다.
인덱스의 클리어
모델의 모든 레코드를 검색 인덱스로부터 삭제하려면scout:flush를 사용합니다.
인덱스의 일시 정지
Eloquent 조작 중에 검색 인덱스와의 동기를 일시적으로 멈추고 싶은 경우는withoutSyncingToSearch를 사용합니다.
레코드의 수동 추가·삭제
쿼리를 사용해 모델의 컬렉션을 인덱스에 추가할 수 있습니다.unsearchable을 사용합니다.
delete하면, 인덱스에서도 자동적으로 삭제됩니다.
검색
search 메서드로 모델을 검색합니다. get을 연결해 Eloquent 모델의 컬렉션을 취득합니다.
raw 메서드를 사용합니다.
시맨틱 검색
임베딩을 설정한database·Meilisearch·Typesense·Turbopuffer 엔진에서는, 쿼리의 의미에 근거해 레코드를 검색할 수 있습니다. 검색 쿼리에 semantic 메서드를 추가합니다. Scout가 임베딩을 생성하는 경우, 시맨틱 검색·하이브리드 검색에는 Laravel AI SDK가 필요합니다. Typesense의 네이티브 임베딩과 Turbopuffer의 네이티브 임베딩, 사전 계산된 쿼리 벡터를 사용하는 경우는 Laravel AI SDK는 불필요합니다.
hybrid 메서드를 사용합니다. 인수로 텍스트 검색과 시맨틱 검색의 상대적인 가중치를 지정할 수 있습니다.
페이지네이션
paginate 메서드로 검색 결과를 페이지네이션할 수 있습니다. 통상의 Eloquent 쿼리의 페이지네이션과 마찬가지로 기능합니다.
simplePaginate도 사용할 수 있습니다. 총 건수를 취득하지 않기 때문에 대규모 데이터셋에서 효율적입니다.
필터링과 정렬
where 메서드로 검색 쿼리에 필터 조건을 추가할 수 있습니다.
query 메서드로 Eloquent 쿼리를 커스터마이즈할 수도 있습니다.
Eager Loading
Scout를 사용하면, 검색 엔진으로부터 ID의 일람을 취득한 후, Eloquent로 모델을 취득합니다. N+1 문제를 피하려면,query 메서드에서 with()을 사용한 Eager Loading을 지정합니다.
makeAllSearchableUsing 메서드를 정의합니다.
소프트 삭제
인덱스된 모델이 소프트 삭제를 사용하고 있고, 삭제된 모델도 검색하고 싶은 경우는,config/scout.php의 soft_delete 옵션을 true로 설정합니다.
withTrashed나 onlyTrashed로 삭제된 레코드를 검색할 수 있습니다.
커스텀 엔진
조립된 검색 엔진이 니즈에 맞지 않는 경우는, 독자적인 커스텀 엔진을 구현할 수 있습니다. 커스텀 엔진은Laravel\Scout\Engines\Engine 추상 클래스를 상속하고, 이하의 8개의 메서드를 구현해야 합니다.
Laravel\Scout\Engines\AlgoliaEngine 클래스를 확인해 주세요.
작성한 커스텀 엔진은, App\Providers\AppServiceProvider의 boot 메서드에서 Scout에 등록합니다.
config/scout.php에서 드라이버로서 지정합니다.
관련 페이지
Eloquent ORM
Eloquent 모델의 기본적인 사용법을 확인합니다.
Eloquent 릴레이션
릴레이션의 정의와 Eager Loading을 확인합니다.
큐
Scout는 큐와 함께 인덱스를 백그라운드에서 업데이트할 수 있습니다.