확장자는 Laravel/Scout에서 얻은 아이디어와 YII2 활성 레코드를위한 TeamTnt/Tntearch Wrapper를 기반으로 간단한 전체 텍스트 검색을 제공합니다.
작곡가를 사용하여 YII2 검색 가능 :
composer require vxm/yii2-searchable 마지막으로, vxmsearchableSearchableTrait 특성을 추가하고 검색 가능한 활성 레코드에 vxmsearchableSearchableBehavior 동작을 첨부하십시오. 이렇게하면 모델을 인덱스 데이터와 동기화하는 데 도움이됩니다.
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
}이 확장자를 사용하는 데 엄격히 필요하지는 않지만 확장자를 사용하기 전에 YII2- 큐를 구성하는 것을 강력히 고려해야합니다. 대기열 작업자를 실행하면 모델 정보를 검색 인덱스와 동기화하는 모든 작업을 큐를 큐에 넣어 응용 프로그램의 웹 인터페이스에 훨씬 더 나은 응답 시간을 제공합니다.
큐 구성 요소를 구성한 후에는 응용 프로그램 구성 파일의 큐 옵션 값을 구성 요소 ID 또는 배열 구성으로 설정하십시오.
' components ' => [
' searchable ' => [
' class ' => ' vxmsearchableSearchable ' ,
' queue ' => ' queueComponentId '
]
] 기본적으로 ID searchable 부트 스트랩을 통해 구성 요소가 응용 프로그램 구성 요소에 추가됩니다. 구성 해야하는 경우 애플리케이션 구성 파일에서 구성을 수동으로 할 수 있습니다.
' components ' => [
' searchable ' => [
' class ' => ' vxmsearchableSearchable ' ,
' storagePath ' => ' @runtime/vxm/search ' ,
' queue ' => null , // an optional not required
' defaultSearchMode ' => vxm searchable Searchable:: FUZZY_SEARCH ,
' asYouType ' => false ,
' fuzziness ' => false ,
' fuzzyPrefixLength ' => 2 ,
' fuzzyMaxExpansions ' => 50 ,
' fuzzyMaxExpansions ' => 50 ,
' fuzzyDistance ' => 50
]
] 각 활성 레코드 모델은 해당 모델에 대한 검색 가능한 모든 레코드를 포함하는 주어진 검색 index 와 동기화됩니다. 즉, 각 색인을 MySQL 테이블처럼 생각할 수 있습니다. 기본적으로 각 모델은 모델의 일반적인 table 이름과 일치하는 인덱스로 유지됩니다. 일반적으로 이것은 모델 이름의 복수형입니다. 그러나 활성 레코드 모델 클래스에서 searchableIndex 정적 메소드를 재정의하여 index 이름을 자유롭게 사용자 정의 할 수 있습니다.
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Get the index name for the model class.
*
* @return string
*/
public static function searchableIndex (): string
{
return ' articles_index ' ;
}
} 기본적으로 주어진 모델의 전체 toArray 형태는 검색 인덱스에 지속됩니다. 검색 인덱스와 동기화 된 데이터를 사용자 정의하려면 모델의 toSearchableArray 메소드를 무시할 수 있습니다.
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Get the indexable data array for the model.
*
* @return array
*/
public function toSearchableArray (): array
{
$ array = $ this -> toArray ();
// Customize array...
return $ array ;
}
} 기본적으로 검색 인덱스에 저장된 고유 ID로 모델의 기본 키 이름입니다. 이 동작을 사용자 정의 해야하는 경우 모델에서 searchableKey 정적 메소드를 무시할 수 있습니다.
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Get searchable key by default primary key will be use.
*
* @return string key name.
*/
public static function searchableKey (): string
{
return ' id ' ;
}
}기존 프로젝트에 확장을 설치하는 경우 이미 검색 드라이버로 가져와야하는 데이터베이스 레코드가있을 수 있습니다. 이 확장자는 기존 레코드를 모두 검색 인덱스로 가져 오는 데 사용할 수있는 가져 오기 조치를 제공합니다.
php yii searchable/import -- models ="app models Post " 분리기로 다중 모델 클래스를 가져올 수 있습니다 ,
php yii searchable/import -- models ="app models Post , app models Category " vxmsearchableSearchableTrait 을 추가하고 vxmsearchableSearchableBehavior 동작을 모델에 첨부 한 후에는 모델 인스턴스를 저장하면 검색 색인에 자동으로 추가됩니다. 구성된 큐가있는 경우이 작업은 큐 작업자가 백그라운드에서 수행됩니다.
$ post = new app models Post ;
// ...
$ post -> save (); 검색 인덱스에 활성 쿼리 결과를 추가하려면 Active Query 결과에 makeSearchable 메소드를 사용할 수 있습니다. makeSearchable 메소드는 쿼리 결과를 청구하고 검색 인덱스에 레코드를 추가합니다. 다시 한 번, 큐가 구성된 경우, 모든 청크는 큐 작업자가 백그라운드에 추가됩니다.
// Adding via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models ); makeSearchable 방법은 upsert 작업으로 간주 될 수 있습니다. 다시 말해, 모델 레코드가 이미 인덱스에 있으면 업데이트됩니다. 검색 인덱스에 존재하지 않으면 인덱스에 추가됩니다.
검색 가능한 모델을 업데이트하려면 모델 인스턴스의 속성을 업데이트하고 모델을 데이터베이스에 저장하면됩니다. 이 확장은 검색 인덱스의 변경 사항을 자동으로 유지합니다.
$ post = app models Post:: findOne ( 1 );
// Update the post...
$ post -> save (); 활성 레코드 클래스에서 makeSearchable 메소드를 사용하여 인스턴스를 업데이트 할 수도 있습니다. 검색 인덱스에 모델이 존재하지 않으면 다음이 생성됩니다.
// Updating via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models );색인에서 레코드를 삭제하려면 데이터베이스에서 모델을 삭제하십시오.
$ post = app models Post:: findOne ( 1 );
$ post -> delete (); 검색 인덱스에서 활성 쿼리 결과를 삭제하려면 활성 레코드 클래스에서 deleteSearchable 메소드를 사용할 수 있습니다.
// Deleting via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: deleteSearchable ( $ models ); 때로는 모델 데이터를 검색 인덱스에 동기화하지 않고 모델에서 활성 레코드 작업을 수행해야 할 수도 있습니다. withoutSyncingToSearch 방법을 사용하여이를 수행 할 수 있습니다. 이 메소드는 즉시 실행되는 단일 콜백을 허용합니다. 콜백 내에서 발생하는 모든 모델 작업은 모델의 인덱스와 동기화되지 않습니다.
app models Post:: withoutSyncingToSearch ( function () {
$ post = app models Post:: findOne ( 1 );
$ post -> save (); // will not syncing with index data
}); 때로는 특정 조건에서 모델을 검색 할 수 있도록해야 할 수도 있습니다. 예를 들어, 두 가지 상태 중 하나에있을 수있는 appmodelsArticle 모델이 있다고 상상해보십시오. draft 및 published . published 게시물을 검색 할 수 있도록 허용 할 수 있습니다. 이를 달성하려면 모델에서 shouldBeSearchable 방법을 정의 할 수 있습니다.
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
/**
* Determine if the model should be searchable.
*
* @return bool
*/
public static function shouldBeSearchable ()
{
return $ this -> is_published ;
}
} shouldBeSearchable 방법은 저장 메소드를 통해 모델을 조작 할 때만 적용됩니다. searchable 또는 makeSearchable 메소드를 사용하여 모델을 직접 작성하면 shouldBeSearchable 방법의 결과가 무시됩니다.
// Will respect "shouldBeSearchable"...
$ post = app models Post:: findOne ( 1 );
$ post -> save ();
// Will override "shouldBeSearchable"...
$ post -> searchable ();
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models ); search 방법을 사용하여 모델 검색을 시작할 수 있습니다. 검색 방법은 모델을 검색하는 데 사용될 단일 문자열을 수락합니다. 이 메소드는 ActiveQuery 반환합니다. 원산지 쿼리와 같은 더 많은 조건이나 관계를 추가 할 수 있습니다.
참고 더 많은 쿼리 조건을 추가하면 검색 ID 조건 결과를 무시하기 때문에 메소드가 사용되는
whereandWhere대신 또는orWhere사용해서는 안됩니다.
$ posts = app models Post:: search ( ' vxm ' )-> all ();
$ posts = app models Post:: search ( ' vxm ' )-> andWhere ([ ' author_id ' => 1 ])-> all ();
// not use
$ posts = app models Post:: search ( ' vxm ' )-> where ([ ' author_id ' => 1 ])-> all (); Relations searchable 과 함께 검색 쿼리의 관계에 가입 할 수 있습니다.
$ posts = app models Post:: search ( ' vxm ' )-> joinWith ( ' category ' )-> andWhere (Category:: search ( ' vxm category ' )); Searchable 구성 요소의 defaultSearchMode 설정하지 않으면 boolean 또는 fuzzy 검색 모드를 두 번째 매개 변수로 선택할 수 있습니다.
$ posts = app models Post:: search ( ' vxm ' , ' fuzzy ' , [ ' fuzziness ' => true ])-> all ();
$ posts = app models Post:: search ( ' vxm ' , ' boolean ' )-> all ();검색 모드에 대한 자세한 내용은 TeamTNT/TNTearch를 참조하여 전체 문서를 보려면 참조하십시오.