PHP용 퍼지 검색 라이브러리
이것은 멋진 Fuse.js 프로젝트의 PHP 포트이며 가능한 한 완전한 API 호환성을 제공하는 것을 목표로 합니다.
이 라이브러리가 무엇을 할 수 있는지에 대한 좋은 느낌을 얻으려면 데모와 예제를 확인하십시오.
최신 호환 Fuse.js 버전: 7.0.0
목차:
이 패키지는 Composer를 통해 제공됩니다. 프로젝트에 추가하려면 다음을 실행하세요.
composer require loilo/fuse
Fuse를 사용하려면 PHP 7.4 이상이 필요합니다.
다음은 간단한 사용 예입니다.
<?php
require_once ' vendor/autoload.php ' ;
$ list = [
[
' title ' => " Old Man's War " ,
' author ' => ' John Scalzi ' ,
],
[
' title ' => ' The Lock Artist ' ,
' author ' => ' Steve Hamilton ' ,
],
[
' title ' => ' HTML5 ' ,
' author ' => ' Remy Sharp ' ,
],
[
' title ' => ' Right Ho Jeeves ' ,
' author ' => ' P.D Woodhouse ' ,
],
];
$ options = [
' keys ' => [ ' title ' , ' author ' ],
];
$ fuse = new Fuse Fuse ( $ list , $ options );
$ fuse -> search ( ' hamil ' );
이는 다음과 같은 결과로 이어집니다(여기서 각 결과의 item
일치하는 항목 자체를 참조하고 refIndex
원본 $list
에서 항목의 위치를 제공합니다).
[
[
' item ' => [
' title ' => ' The Lock Artist ' ,
' author ' => ' Steve Hamilton ' ,
],
' refIndex ' => 1 ,
],
[
' item ' => [
' title ' => ' HTML5 ' ,
' author ' => ' Remy Sharp ' ,
],
' refIndex ' => 2 ,
],
];
Fuse에는 검색을 세분화할 수 있는 다양한 옵션이 있습니다.
isCaseSensitive
bool
false
비교 시 대소문자를 구분해야 하는지 여부를 나타냅니다.
includeScore
bool
false
점수가 결과 세트에 포함되어야 하는지 여부입니다. 0
점은 완벽한 일치를 나타내고 1
점은 완전한 불일치를 나타냅니다.
includeMatches
bool
false
일치 항목을 결과 집합에 포함할지 여부입니다. true
인 경우 결과 집합의 각 레코드에는 일치하는 문자의 인덱스가 포함됩니다. 결과적으로 강조 표시 목적으로 사용될 수 있습니다.
minMatchCharLength
int
1
길이가 이 값을 초과하는 일치 항목만 반환됩니다. (예를 들어 결과에서 단일 문자 일치를 무시하려면 2
로 설정하십시오.)
shouldSort
bool
true
결과 목록을 점수별로 정렬할지 여부입니다.
findAllMatches
bool
false
true인 경우, 완벽하게 일치하는 항목이 문자열에 이미 있는 경우에도 일치 함수는 검색 패턴의 끝까지 계속됩니다.
keys
array
[]
검색할 키 목록입니다. 이는 중첩 경로, 가중치 검색, 문자열 및 객체 배열 검색을 지원합니다.
location
int
0
텍스트에서 발견될 것으로 예상되는 패턴이 있는 대략적인 위치를 결정합니다.
threshold
float
0.6
일치 알고리즘은 어느 시점에서 포기합니까? 임계값이 0.0
이면 문자와 위치 모두가 완벽하게 일치해야 하며 임계값이 1.0
이면 무엇이든 일치합니다.
distance
int
100
일치 항목이 퍼지 위치( location
으로 지정됨)에 얼마나 가까워야 하는지 결정합니다. 퍼지 위치에서 문자가 distance
떨어져 있는 정확한 문자 일치는 완전한 불일치로 점수가 매겨집니다. distance
가 0
이면 일치 항목이 지정된 정확한 location
에 있어야 합니다. 거리가 1000
이면 threshold
0.8
사용하여 찾을 location
의 800
자 이내에서 완벽한 일치가 필요합니다.
ignoreLocation
bool
false
true
인 경우 검색은 location
및 distance
무시하므로 문자열에서 패턴이 나타나는 위치는 중요하지 않습니다.
팁: 기본 옵션은 처음 60자만 검색합니다. 일치 항목이 이 범위 내에 있을 것으로 합리적으로 예상되는 경우 이는 충분합니다. 이 동작을 수정하려면
location
,threshold
,distance
(또는ignoreLocation
)의 적절한 조합을 설정하십시오.이러한 옵션이 어떻게 함께 작동하는지 더 잘 이해하려면 Fuse.js의 채점 이론을 읽어보세요.
useExtendedSearch
bool
false
true
인 경우 유닉스 계열 검색 명령을 사용할 수 있습니다. 예를 참조하세요.
getFn
callable
제공된 경로에서 객체의 값을 검색하는 데 사용하는 함수입니다. 기본값은 중첩된 경로도 검색합니다.
sortFn
callable
모든 결과를 정렬하는 데 사용하는 기능입니다. 기본값은 관련성 점수 오름차순, 색인 오름차순으로 정렬됩니다.
ignoreFieldNorm
bool
false
true
인 경우 관련성 점수 계산(정렬에 사용됨)에서 필드 길이 표준을 무시합니다.
팁:
ignoreFieldNorm
true
로 설정하는 것이 적합한 유일한 경우는 용어의 개수가 중요하지 않고 쿼리 용어가 존재하는 경우입니다.
fieldNormWeight
float
1
필드 길이 표준이 채점에 얼마나 영향을 미치는지 결정합니다. 값 0
은 필드 길이 표준을 무시하는 것과 같습니다. 값이 0.5
이면 필드 길이 표준의 효과가 크게 줄어들고 값이 2.0
이면 크게 늘어납니다.
config
메소드를 통해 위의 모든 옵션의 기본값에 액세스하고 조작할 수 있습니다:
// Get an associative array of all options listed above
Fuse :: config ();
// Merge associative array of options into default config
Fuse :: config ([ ' shouldSort ' => false ]);
// Get single default option
Fuse :: config ( ' shouldSort ' );
// Set single default option
Fuse :: config ( ' shouldSort ' , false );
각 FuseFuse
인스턴스에서 다음 메서드를 사용할 수 있습니다.
search
전체 문서 모음을 검색하고 검색 결과 목록을 반환합니다.
public function search( mixed $ pattern , ? array $ options ): array
$pattern
다음 중 하나일 수 있습니다.
$options
:
limit
(type: int
): 반환된 검색 결과의 최대 수를 나타냅니다.setCollection
전체 문서 모음을 설정/교체합니다. 색인이 제공되지 않으면 색인이 생성됩니다.
public function setCollection( array $ docs , ? Fuse Core FuseIndex $ index ): void
예:
$ fruits = [ ' apple ' , ' orange ' ];
$ fuse = new Fuse ( $ fruits );
$ fuse -> setCollection ([ ' banana ' , ' pear ' ]);
add
컬렉션에 문서를 추가하고 이에 따라 색인을 업데이트합니다.
public function add( mixed $ doc ): void
예:
$ fruits = [ ' apple ' , ' orange ' ];
$ fuse = new Fuse ( $ fruits );
$ fuse -> add ( ' banana ' );
sizeof ( $ fruits ); // => 3
remove
조건자가 진실을 반환하는 목록에서 모든 문서를 제거하고 제거된 문서의 배열을 반환합니다. 조건자는 ($doc, $index)
두 개의 인수로 호출됩니다.
public function remove(? callable $ predicate ): array
예:
$ fruits = [ ' apple ' , ' orange ' , ' banana ' , ' pear ' ];
$ fuse = new Fuse ( $ fruits );
$ results = $ fuse -> remove (fn( $ doc ) => $ doc === ' banana ' || $ doc === ' pear ' );
sizeof ( $ fuse -> getCollection ()); // => 2
$ results ; // => ['banana', 'pear']
removeAt
지정된 인덱스의 문서를 제거합니다.
public function removeAt( int $ index ): void
예:
$ fruits = [ ' apple ' , ' orange ' , ' banana ' , ' pear ' ];
$ fuse = new Fuse ( $ fruits );
$ fuse -> removeAt ( 1 );
$ fuse -> getCollection (); // => ['apple', 'banana', 'pear']
getIndex
생성된 퓨즈 인덱스를 반환합니다.
public function getIndex(): Fuse Core FuseIndex
예:
$ fruits = [ ' apple ' , ' orange ' , ' banana ' , ' pear ' ];
$ fuse = new Fuse ( $ fruits );
$ fuse -> getIndex ()-> size (); // => 4
각 FuseFuse
인스턴스에서 다음 메서드를 사용할 수 있습니다.
Fuse::createIndex
목록에서 인덱스를 미리 생성하고 이를 Fuse 인스턴스에 직접 전달합니다. 목록이 (상당히) 크면 인스턴스화 속도가 빨라집니다.
public static function createIndex( array $ keys , array $ docs , array $ options = []): Fuse Core FuseIndex
예:
$ list = [ ... ]; // See the example from the 'Usage' section
$ options = [ ' keys ' => [ ' title ' , ' author.firstName ' ] ];
// Create the Fuse index
$ myIndex = Fuse :: createIndex ( $ options [ ' keys ' ], $ list );
// Initialize Fuse with the index
$ fuse = new Fuse ( $ list , $ options , $ myIndex );
Fuse::parseIndex
JSON 직렬화된 Fuse 인덱스를 구문 분석합니다.
public static function parseIndex( array $ data , array $ options = []): Fuse Core FuseIndex
예:
// (1) When the data is collected
$ list = [ ... ]; // See the example from the 'Usage' section
$ options = [ ' keys ' => [ ' title ' , ' author.firstName ' ] ];
// Create the Fuse index
$ myIndex = Fuse :: createIndex ( $ options [ ' keys ' ], $ list );
// Serialize and save it
file_put_contents ( ' fuse-index.json ' , json_encode ( $ myIndex ));
// (2) When the search is needed
// Load and deserialize index to an array
$ fuseIndex = json_decode ( file_get_contents ( ' fuse-index.json ' ), true );
$ myIndex = Fuse :: parseIndex ( $ fuseIndex );
// Initialize Fuse with the index
$ fuse = new Fuse ( $ list , $ options , $ myIndex );
Fuse.js | PHP 퓨즈 | |
---|---|---|
퓨즈 버전 받기 | Fuse.version | – |
전역 구성에 액세스 | Fuse.config 속성 | Fuse::config 메소드 |
목록 수정 | fuse.add() 등을 사용하면 new Fuse 생성자에 전달된 원래 목록이 수정됩니다. | PHP에서 배열은 기본 데이터 유형입니다. 즉, 원래 목록은 퓨즈에 의해 수정되지 않습니다. 항목을 추가/제거한 후 현재 목록을 받으려면 $fuse->getCollection() 메서드를 사용할 수 있습니다. |
나는 Fuse.js와 기능 동등성을 위해 노력하고 있으므로 Fuse.js 자체에 반영되지 않은 검색 논리에 기능이나 수정 사항을 추가하지 않을 것입니다.
이 PHP 포트의 버그가 아닌 검색 결과에 문제가 있고 JavaScript를 알고 있는 경우 Fuse.js의 온라인 데모에서 사용 사례가 올바르게 작동하는지 확인하십시오. 이는 표준 Fuse 구현입니다. 문제가 거기에도 나타나면 저장소에서 문제를 열어주세요.
Fuse에서 개발을 시작하려면 git, PHP(≥ 7.4) 및 Composer가 필요합니다.
Prettier를 사용하여 코드 형식이 지정되므로 Node.js/npm을 설치하고 Prettier 형식을 지원하는 편집기를 사용하는 것도 권장됩니다.
저장소를 복제하고 여기에 cd
넣으세요.
git clone https://github.com/loilo/fuse.git
cd fuse
Composer 종속성을 설치합니다.
composer install
npm 종속 항목을 설치합니다(선택 사항이지만 권장됨). npm 종속 항목에는 이 프로젝트에서 사용하는 Prettier 플러그인이 포함되어 있으므로 이는 코드 형식 지정에만 필요합니다.
npm ci
이 프로젝트에는 다양한 종류의 코드 검사가 있습니다. 이들 모두는 풀 요청이 제출될 때 실행되지만 로컬로 실행될 수도 있습니다.
명령 | 목적 | 설명 |
---|---|---|
vendor/bin/phpcs | 코드 스타일 확인 | PHP_CodeSniffer를 실행하여 Fuse 소스 코드가 PSR-12 코딩 스타일을 준수하는지 확인하세요. |
vendor/bin/psalm | 정적 분석 | 유형 관련 오류와 안전하지 않은 코딩 패턴을 방지하려면 코드베이스에 대해 Psalm을 실행하세요. |
vendor/bin/phpunit | 프로그램 로직을 확인하세요 | test 폴더에서 모든 PHPUnit 테스트를 실행합니다. |
풀 요청을 제출하기 전에 관련 테스트를 test
폴더에 추가하세요.