TNTSearch는 전적으로 PHP로 작성된 전체 텍스트 검색(FTS) 엔진입니다. 간단한 구성을 통해 단 몇 분만에 놀라운 검색 경험을 추가할 수 있습니다. 기능은 다음과 같습니다:
또한 n-gram을 사용하여 관용적인 검색을 보여주는 데모 페이지도 만들었습니다. 패키지에는 거리 계산을 위한 Jaro-Winkler 및 Cosine 유사성과 같은 다양한 도우미 함수가 있습니다. 영어, 크로아티아어, 아랍어, 이탈리아어, 러시아어, 포르투갈어 및 우크라이나어에 대한 형태소 분석을 지원합니다. 내장된 형태소 분석기로 충분하지 않은 경우 엔진을 사용하여 호환 가능한 눈덩이 형태소 분석기를 쉽게 플러그인할 수 있습니다. 패키지의 일부 포크는 중국어도 지원합니다. 그리고 다른 언어에도 기여해주세요!
다른 많은 엔진과 달리 인덱스는 재색인을 수행하거나 델타를 사용하지 않고도 쉽게 업데이트할 수 있습니다.
온라인 데모 보기 | 트위터나 페이스북에서 우리를 팔로우하세요 | 후원자를 방문하세요 :
TNT Search를 사용하고 있고 그것이 유용하다고 생각한다면 프리미엄 분석 도구를 살펴보세요:
TNTSearch를 설치하는 가장 쉬운 방법은 작곡가를 이용하는 것입니다:
composer require teamtnt/tntsearch
계속하기 전에 서버가 다음 요구 사항을 충족하는지 확인하세요.
전체 텍스트 검색 쿼리를 만들려면 인덱스를 만들어야 합니다.
용법:
use TeamTNT TNTSearch TNTSearch ;
$ tnt = new TNTSearch ;
$ tnt -> loadConfig ([
' driver ' => ' mysql ' ,
' host ' => ' localhost ' ,
' database ' => ' dbname ' ,
' username ' => ' user ' ,
' password ' => ' pass ' ,
' storage ' => ' /var/www/tntsearch/examples/ ' ,
' stemmer ' => TeamTNT TNTSearch Stemmer PorterStemmer ::class//optional
]);
$ indexer = $ tnt -> createIndex ( ' name.index ' );
$ indexer -> query ( ' SELECT id, article FROM articles; ' );
//$indexer->setLanguage('german');
$ indexer -> run ();
중요: "저장소" 설정은 모든 색인이 저장될 폴더를 표시하므로 이 폴더에 쓸 수 있는 권한이 있는지 확인하십시오. 그렇지 않으면 다음 예외가 발생할 수 있습니다.
참고: 기본 키가 id
와 다른 경우 다음과 같이 설정하십시오.
$ indexer -> setPrimaryKey ( ' article_id ' );
기본적으로 기본 키는 검색할 수 없습니다. 검색 가능하게 만들려면 다음을 실행하세요.
$ indexer -> includePrimaryKey ();
문구나 키워드를 검색하는 것은 간단합니다.
use TeamTNT TNTSearch TNTSearch ;
$ tnt = new TNTSearch ;
$ tnt -> loadConfig ( $ config );
$ tnt -> selectIndex ( " name.index " );
$ res = $ tnt -> search ( " This is a test search " , 12 );
print_r ( $ res ); //returns an array of 12 document ids that best match your query
// to display the results you need an additional query against your application database
// SELECT * FROM articles WHERE id IN $res ORDER BY FIELD(id, $res);
ORDER BY FIELD 절은 중요합니다. 그렇지 않으면 데이터베이스 엔진이 필요한 순서로 결과를 반환하지 않습니다.
use TeamTNT TNTSearch TNTSearch ;
$ tnt = new TNTSearch ;
$ tnt -> loadConfig ( $ config );
$ tnt -> selectIndex ( " name.index " );
//this will return all documents that have romeo in it but not juliet
$ res = $ tnt -> searchBoolean ( " romeo -juliet " );
//returns all documents that have romeo or hamlet in it
$ res = $ tnt -> searchBoolean ( " romeo or hamlet " );
//returns all documents that have either romeo AND juliet or prince AND hamlet
$ res = $ tnt -> searchBoolean ( " (romeo juliet) or (prince hamlet) " );
퍼지는 다음 멤버 변수를 설정하여 조정할 수 있습니다.
public $ fuzzy_prefix_length = 2 ;
public $ fuzzy_max_expansions = 50 ;
public $ fuzzy_distance = 2 ; //represents the Levenshtein distance;
use TeamTNT TNTSearch TNTSearch ;
$ tnt = new TNTSearch ;
$ tnt -> loadConfig ( $ config );
$ tnt -> selectIndex ( " name.index " );
$ tnt -> fuzziness ( true );
//when the fuzziness flag is set to true, the keyword juleit will return
//documents that match the word juliet, the default Levenshtein distance is 2
$ res = $ tnt -> search ( " juleit " );
색인을 생성한 후에는 문서 컬렉션을 변경할 때마다 다시 색인을 생성할 필요가 없습니다. TNTSearch는 동적 인덱스 업데이트를 지원합니다.
use TeamTNT TNTSearch TNTSearch ;
$ tnt = new TNTSearch ;
$ tnt -> loadConfig ( $ config );
$ tnt -> selectIndex ( " name.index " );
$ index = $ tnt -> getIndex ();
//to insert a new document to the index
$ index -> insert ([ ' id ' => ' 11 ' , ' title ' => ' new title ' , ' article ' => ' new article ' ]);
//to update an existing document
$ index -> update ( 11 , [ ' id ' => ' 11 ' , ' title ' => ' updated title ' , ' article ' => ' updated article ' ]);
//to delete the document from index
$ index -> delete ( 12 );
먼저 자신만의 Tokenizer 클래스를 만듭니다. AbstractTokenizer 클래스를 확장하고 단어 분할 $pattern 값을 정의하며 TokenizerInterface를 구현해야 합니다.
use TeamTNT TNTSearch Support AbstractTokenizer ;
use TeamTNT TNTSearch Support TokenizerInterface ;
class SomeTokenizer extends AbstractTokenizer implements TokenizerInterface
{
static protected $ pattern = ' /[s,.]+/ ' ;
public function tokenize ( $ text ) {
return preg_split ( $ this -> getPattern (), strtolower ( $ text ), - 1 , PREG_SPLIT_NO_EMPTY );
}
}
이 토크나이저는 공백, 쉼표 및 마침표를 사용하여 단어를 분할합니다.
토크나이저가 준비된 후에는 setTokenizer
메소드를 통해 TNTIndexer
에 전달해야 합니다.
$ someTokenizer = new SomeTokenizer ;
$ indexer = new TNTIndexer ;
$ indexer -> setTokenizer ( $ someTokenizer );
또 다른 방법은 구성을 통해 토크나이저를 전달하는 것입니다.
use TeamTNT TNTSearch TNTSearch ;
$ tnt = new TNTSearch ;
$ tnt -> loadConfig ([
' driver ' => ' mysql ' ,
' host ' => ' localhost ' ,
' database ' => ' dbname ' ,
' username ' => ' user ' ,
' password ' => ' pass ' ,
' storage ' => ' /var/www/tntsearch/examples/ ' ,
' stemmer ' => TeamTNT TNTSearch Stemmer PorterStemmer ::class//optional,
' tokenizer ' => TeamTNT TNTSearch Support SomeTokenizer ::class
]);
$ indexer = $ tnt -> createIndex ( ' name.index ' );
$ indexer -> query ( ' SELECT id, article FROM articles; ' );
$ indexer -> run ();
$ candyShopIndexer = new TNTGeoIndexer ;
$ candyShopIndexer -> loadConfig ( $ config );
$ candyShopIndexer -> createIndex ( ' candyShops.index ' );
$ candyShopIndexer -> query ( ' SELECT id, longitude, latitude FROM candy_shops; ' );
$ candyShopIndexer -> run ();
$ currentLocation = [
' longitude ' => 11.576124 ,
' latitude ' => 48.137154
];
$ distance = 2 ; //km
$ candyShopIndex = new TNTGeoSearch ();
$ candyShopIndex -> loadConfig ( $ config );
$ candyShopIndex -> selectIndex ( ' candyShops.index ' );
$ candyShops = $ candyShopIndex -> findNearest ( $ currentLocation , $ distance , 10 );
use TeamTNT TNTSearch Classifier TNTClassifier ;
$ classifier = new TNTClassifier ();
$ classifier -> learn ( " A great game " , " Sports " );
$ classifier -> learn ( " The election was over " , " Not sports " );
$ classifier -> learn ( " Very clean match " , " Sports " );
$ classifier -> learn ( " A clean but forgettable game " , " Sports " );
$ guess = $ classifier -> predict ( " It was a close election " );
var_dump ( $ guess [ ' label ' ]); //returns "Not sports"
$ classifier -> save ( ' sports.cls ' );
$ classifier = new TNTClassifier ();
$ classifier -> load ( ' sports.cls ' );
이 패키지를 무료로 사용할 수 있지만, 귀하의 프로덕션 환경에 적용된다면 원하는 PS4 게임을 보내주시면 감사하겠습니다. 이를 통해 새로운 기능을 더욱 개발하고 추가할 수 있도록 지원해 드립니다.
우리의 주소는 다음과 같습니다: TNT Studio, Sv. Mateja 19, 10010 자그레브, 크로아티아.
수신된 모든 게임을 여기에 게시하겠습니다.
매달 기부금으로 후원해 주시고, 활동을 계속할 수 있도록 도와주세요. [후원자가 되세요]
스폰서가 되어 Github의 README에 귀하의 사이트 링크가 포함된 로고를 얻으세요. [후원자가 되세요]
MIT 라이센스(MIT). 자세한 내용은 라이센스 파일을 참조하십시오.
크로아티아에서 ♥ by TNT Studio(@tntstudiohr, 블로그)