이 패키지는 SQL 데이터베이스를 스토리지 백엔드로 사용하여 인덱스 된 모델 데이터에 대한 전체 텍스트 검색을 수행하는 일반적인 Laravel Scout 드라이버를 제공합니다. 인덱스 된 데이터는 정규화 된 형태로 저장되므로 전체 및/또는 정확한 일치가 필요하지 않은 효율적이고 퍼지 검색이 가능합니다.
이 드라이버는 teamtnt/laravel-scout-tntsearch-driver 의 대안입니다. 기본 차이점은이 드라이버가 더 적은 수의 기능 (지리 검색)을 제공한다는 것입니다. 대신 Laravel 자체가 지원하는 모든 데이터베이스 시스템 (기본적으로 모든 PDO 드라이버)에서 작동합니다. 또한 검색 알고리즘이 약간 다릅니다.
모든 테스트는 다음 데이터베이스 시스템에서 PHP 8.0, 8.1 및 8.2의 GitHub 작업을 통해 실행됩니다.
지원되는 데이터베이스 시스템에 대한 실제 제한 사항은 대부분 Staudenmeir/Laravel-CTE를 사용한 공통 테이블 표현식 의 사용과 관련이 있습니다. 패키지를 사용하기 전에 데이터베이스 시스템이 지원되거나 데이터베이스 오류가 발생할 수 있는지 확인하십시오.
작곡가를 통해 패키지를 설치할 수 있습니다.
composer require namoshek/laravel-scout-database패키지를 설치 한 후 구성 파일과 마이그레이션을 게시해야합니다.
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " config "
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " migrations " 이 패키지에서 생성 된 테이블의 scout_ 와 다른 테이블 접두사를 사용하려면 구성과 복사 마이그레이션을 변경해야합니다. 그렇게하면 데이터베이스 마이그레이션을 적용 할 수 있습니다.
php artisan migratev0.x 에서 v1.x 로 업그레이드 새 버전을 사용하면 데이터베이스 스키마가 변경되었으며 다음을 사용하여 새로운 마이그레이션을 게시해야합니다.
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " migrations "설치 섹션에서 위에서 언급 한 것과 동일한 힌트는 새로 게시 된 마이그레이션에도 적용됩니다.
구성이 약간 줄어들었고 새 구성 파일과 이전 파일을 비교하여 쓸모없는 설정을 제거 할 수 있습니다. 그러나이 부분을 건너 뛰는 것은 스카우트 드라이버의 성능에 부정적인 영향을 미치지 않습니다.
NamoshekScoutDatabaseCommandsCleanWordsTable::class 명령이 제거되었으며 이전에 추가 한 경우 변경되지 않아야합니다.
protected 필드와 방법의 대부분은 미래의 후진 호환성 변화와 관련하여 개발을 단순화하기 위해 private 로 변경되었습니다. 구현의 일부를 적극적으로 무시하지 않은 경우 전혀 영향을 미치지 않습니다.
이 패키지에서 제공 한 드라이버를 사용하도록 스카우트를 지시하려면 config/scout.php 의 driver 옵션을 database 로 변경해야합니다. 스카우트 구성 파일을 변경하지 않은 경우 SCOUT_DRIVER 환경 변수를 대신 database 로 설정할 수도 있습니다.
패키지 자체의 사용 가능한 모든 구성 옵션은 config/scout-database.php 에서 찾을 수 있습니다. 옵션은 파일 자체에 철저히 설명됩니다. 기본적으로 패키지는 영어에 적합한 UnicodeTokenizer 와 PorterStemmer 사용합니다. 검색은 마지막 토큰에 후행 와일드 카드를 추가하며 결과에 문서가 표시되기 위해 모든 검색어를 찾을 필요는 없습니다 (적어도 하나의 일치가 있어야 함).
구성 파일에서 wildcard_all_tokens 활성화하여 각 검색 토큰에 와일드 카드를 추가 할 수도 있습니다. 성능의 이유로 권장되지 않습니다.
기본 설치는 대부분 이러한 설정을 변경할 필요가 없습니다. 확인하려면 connection 옵션을 살펴 봐야합니다. 이를 변경하려면 마이그레이션을 실행하기 전에 잘못된 데이터베이스 연결을 사용하여 테이블이 생성됩니다.
현재 UnicodeTokenizer 만 사용할 수 있습니다. p{L} 및 p{N} regex 패턴에 따라 문자도 아니고 숫자가 아닌 모든 문자로 문자열을 분할합니다. 이것은 점, 콜론, 대시, 흰색 등이 분할 기준임을 의미합니다.
토큰 화제에 대한 요구 사항이 다르면 구성을 통해 자체 구현을 제공 할 수 있습니다. Tokenizer 인터페이스를 구현하십시오.
현재 wamania/php-stemmer 패키지에서 구현 한 모든 STEMMERS를 사용할 수 있습니다. 각각에 대한 래퍼 클래스가 추가되었습니다.
DanishStemmerDutchStemmerEnglishStemmerFrenchStemmerGermanStemmerItalianStemmerNorwegianStemmerNullStemmer (Stemming을 비활성화하는 데 사용할 수 있음)PorterStemmer (기본값, EnglishStemmer 와 동일)PortugueseStemmerRomanianStemmerRussianStemmerSpanishStemmerSwedishStemmer Stemmer에 대한 요구 사항이 다르면 구성을 통해 자신의 구현을 제공 할 수 있습니다. Stemmer 인터페이스를 구현하는지 확인하십시오.
패키지는 공식 스카우트 문서에 설명 된 사용 가능한 사용 사례를 따릅니다. 그래도 나열된 제한 사항에주의하십시오.
검색 드라이버는 내부적으로 단일 테이블을 사용하는데, 여기에는 이용 약관과 문서 협회가 포함되어 있습니다. 문서를 색인화 할 때 (예 : 검색 인덱스에서 모델 추가 또는 업데이트) 엔진은 구성된 토큰 화기를 사용하여 각 열의 입력을 토큰으로 분할합니다. 기본적으로 구성된 토큰 화기는 단순히 유니 코드 문자 또는 숫자로 구성된 단어로 입력을 분할합니다. 이는 다른 문자 . 의미합니다 , , - , _ ! , ? , / , whitespace 및 기타 모든 특수 문자는 토큰에 대한 분리기로 간주되며 토큰 화기에 의해 제거됩니다. 이런 식으로 그러한 문자는 검색 색인 자체에서 결코 끝나지 않습니다.
입력이 토큰 화 된 후, 각 토큰 (그리고이 시점에서 실제로 우리는 우리의 토큰이 단어가 될 것으로 예상합니다)은 구성된 Stemmer를 통해 줄기 (예 : 루트 단어 )를 검색합니다. 이 작업을 수행하면 나중에 비슷한 단어를 검색 할 수 있습니다. 예를 들어 PorterStemmer intelligent 및 intelligence As Input의 출력으로 intellig 생성합니다. 검색 할 때 이것이 어떻게 도움이되는지는 순간적으로 분명 할 것입니다.
마지막 으로이 프로세스의 결과는 데이터베이스에 저장됩니다. 인덱스 테이블은 스템 밍 프로세스의 결과와 인덱스 모델 (모델 유형 및 식별자)과의 연관성으로 채워져 있습니다. 또한 인덱스의 각 행에 대해 데이터베이스에는 문서에 발생한 수가 포함되어 있습니다. 우리는이 정보를 사용하여 엔진 검색 부분 내에서 점수를 매기기 위해 사용합니다.
검색 쿼리를 실행할 때 인덱싱에 사용 된 것과 동일한 토큰 화 및 스 테밍 프로세스가 검색 쿼리 문자열에 적용됩니다. 이 과정의 결과는 스템 (또는 루트 단어 ) 목록으로 실제 검색을 수행하는 데 사용됩니다. 패키지 구성에 따라 검색은 적어도 하나 또는 전부 스템을 포함하는 문서를 반환합니다. 이는 역 문서 주파수 (즉, 검색 된 단어 중 하나를 포함하는 색인화 된 문서와 문서 간의 비율), 용어 빈도 (즉 문서 내 검색 항의 발생 수) 및 편차 (WildCard 검색과 관련이 있음)를 기반으로 인덱스에서 각 일치에 대한 점수를 계산하여 수행됩니다. 반환 된 것은 원하는 한계에 도달 할 때까지 점수로 내림차순으로 주문한 문서입니다.
사용자 정의 열로 검색 인덱스 테이블 ( scout_index )을 확장 할 수 있습니다. 인덱싱 중에이 열에는 사용자 정의 컨텐츠로 채워질 수 있으며 검색 중에 검색이 이러한 열에 스코핑 될 수 있습니다 (정확한 일치). 이 기능은 여러 테넌트가 검색 지수를 사용하는 다중 테넌시 응용 프로그램으로 작업 할 때 특히 유용합니다.
이 예에서는 검색 인덱스에 필수 tenant_id 열을 추가합니다.
return new class extends Migration {
public function up (): void
{
Schema :: table ( ' scout_index ' , function ( Blueprint $ table ) {
$ table -> uuid ( ' tenant_id ' );
});
}
public function down (): void
{
Schema :: table ( ' scout_index ' , function ( Blueprint $ table ) {
$ table -> dropColumn ([ ' tenant_id ' ]);
});
}
}; tenant_id 각 모델에 대한 인덱싱 중에 추가됩니다.
class User extends Model
{
public function toSearchableArray (): array
{
return [
' id ' => $ this -> id ,
' name ' => $ this -> name ,
' tenant_id ' => new StandaloneField ( $ this -> tenant_id ),
];
}
} tenant_id $tenantId 기반으로 검색 중에 필터링되며, 예를 들어 HTTP 요청에서 가져올 수 있습니다.
User :: search ( ' Max Mustermann ' )
-> where ( ' tenant_id ' , $ tenantId )
-> get ();분명히이 패키지는 Elasticsearch와 같은 전문 검색 엔진의 성능과 품질을 제공하는 검색 엔진을 제공하지 않습니다. 이 솔루션은 다소 간단한 솔루션이 필요한 중소형 프로젝트를위한 것입니다.
또한 다음과 같은 스카우트 기능은 현재 구현되지 않았습니다.
User::search('Mustermann')->within('users_without_admins') 사용하여 사용자 정의 색인 검색User::search('Musterfrau')->orderBy('age', 'desc') 사용하여 사용자 정의 순서로 검색이 검색 엔진의 한 가지 문제는 여러 대기열 작업자가 단일 문서의 인덱싱을 동시에 (데이터베이스에 교착 상태로 표시하는 경우) 문제로 이어질 수 있다는 것입니다. 이 문제를 우회하기 위해 트랜잭션에 사용되는 시도 수는 구성 가능합니다. 기본적으로 교착 상태 (또는 기타 오류)가 발생하면 각 트랜잭션은 최대 3 번 시도됩니다.
MIT 라이센스 (MIT). 자세한 내용은 라이센스 파일을 참조하십시오.