교리 단체에서 사용하기 쉬운 검색 엔진의 구현.
기본적으로 사용하기 위해 검색 된 엔티티 및 해당 속성의 맵을 정의하기 만하면 검색 엔진이 올바르게로드되도록 배열하고 발견 된 후보자를 기반으로 검색 결과를 자동으로 정렬합니다.
패키지의 목적은 교리 단체에서 고급 전체 텍스트 검색을위한 간단한 API를 제공하는 것입니다. 요청이 시작될 때 검색 체계가 구축 되고이 패키지는 최상의 결과가 관련성에 따라 자동으로 발견되고 반환되도록합니다.
패키지 호출 작곡가를 수동으로 설치하고 다음 명령을 실행하려면 다음 명령을 실행하십시오.
$ composer require baraja-core/doctrine-fulltext-search 그런 다음 구성 네온에 DoctrineFulltextSearchExtension 등록하십시오.
extensions :
doctrineFulltextSearch : BarajaSearchDoctrineFulltextSearchExtension 또는 BarajaSearchSearch 인스턴스를 수동으로 만들 수 있습니다.
검색은 쿼리 (매핑 엔티티 및 열)를 작성하여 수행됩니다.
$ results = $ this -> search -> search ( $ query , [
Article ::class => [ ' :title ' ],
User ::class => ' :username ' , // it can also be an ordinary string for a single column
UserLogin ::class => [ ' :ip ' , ' hostname ' , ' userAgent ' ],
]);
echo $ results ; // Uses the default HTML renderer 또는 완전한 엄격한 유형 유효성 검증 및 힌트 메소드가있는 SelectorBuilder 사용하여 쿼리를 빌드 할 수 있습니다.
$ results = $ this -> search -> selectorBuilder ( $ query )
-> addEntity ( Article ::class)
-> addColumnTitle ( ' title ' )
-> addEntity ( User ::class)
-> addColumnTitle ( ' username ' )
-> addEntity ( UserLogin ::class)
-> addColumnTitle ( ' ip ' )
-> addColumn ( ' hostname ' )
-> addColumnSearchOnly ( ' userAgent ' )
-> search ();
echo $ results ;출력을 탈출 할 필요가 없으며 모든 로직은 엔진에 의해 자동으로 해결됩니다.
:username - 열은 캡션으로 사용됩니다.
!slug - 열은 검색에 사용되지만 Perex 출력에서는 무시됩니다.
_durationTime 열은 엔티티에로드되지만 관련성을 계산할 때 고려되지 않으며 PEREX에 포함되지 않습니다.
content.versions.haystack 엔터티 간의 관계는 자동으로 조인을 생성하고 마지막 속성을로드합니다.
versions(content) - 사용자 정의 getter ( versions 열에 자동으로 결합하지만 getContent() 호출하여 데이터를 얻습니다).
열 이름 (예 ':username' )의 시작 부분에서 결장을 사용하는 경우 제목으로 자동으로 사용됩니다.
제목은 검색어가 포함되어 있지 않더라도 표시됩니다.
캡션이 비어있을 수 있으며 존재하지 않을 수 있습니다 ( null 일 수 있음).
제목이 존재하지 않으면 엔진은 찾은 텍스트에서 가장 잘 발생하여 자동으로 계산할 수 있습니다.
검색 쿼리가 자동으로 정규화되고 스톱워드가 제거되어 검색에 적합하지 않습니다.
IQueryNormalizer 인터페이스를 구현하고 DIC 컨테이너에 덮어 쓰면 특정 프로젝트에서 알고리즘을 재정의 할 수 있습니다.
search() 메소드의 출력은 SearchResult 유형의 엔티티이며, 결과를 쉽게 순환 할 수 있도록 Iterator 인터페이스를 구현합니다.
팁 : 검색 결과를 신속하게 인쇄해야하고 외관 요구 사항이 그다지 높지 않은 경우
SearchResult엔티티는 html로 직접 결과를 쉽게 렌더링하기위한__toString()메소드를 직접 구현합니다.
검색 결과는 모든 엔티티의 모든 검색 결과를 요약합니다. 모든 결과는 getItems() 메소드에 의해 얻어집니다 - 출력은 SearchItem[] 유형의 엔티티 배열이됩니다.
그러나 종종 쿼리를 대량으로 컴파일 한 다음 예를 들어 카테고리와 제품을 별도로 나열해야합니다. 이렇게하려면 헬퍼 메소드 getItemsOfType(string $type) 사용하여 전달 된 매개 변수에 따라 엔터티에 대해서만 SearchItem[] 의 결과가 잘린 결과를 반환합니다.
우리는 getItems() 또는 getItemsOfType() 메소드를 사용하여 검색 결과를 얻었습니다. 그러나 특정 결과를 다루는 방법은 무엇입니까?
이 시점에서 우리는 더 이상 __toString() 메소드를 사용할 수 없으며 결과를 직접 렌더링해야합니다.
대부분의 경우 기성품 도우미가 충분합니다.
getTitle() 찾은 엔티티의 제목을 문자열 또는 null로 반환합니다.getTitleHighlighted() 호출 내부적으로 getTitle() 내부적으로, 결과가 유효한 문자열 인 경우 각 단어의 발생을 <i class="highlight"> 및 </i> 로 얼룩 봅니다.getSnippet() 원래 엔티티에서 가장 잘 발견 된 영역을 요약 한 발견 된 엔티티의 스 니펫을 반환합니다 (예 : 검색어가 발생하는 기사 스 니펫). 더 많은 스 니펫을 반환 할 수 있습니다 (개별 발생은 결장으로 나뉩니다). 항상 문자열을 반환합니다 (비어있을 수 있음).getTitleHighlighted() 내부 호출 getSnippet() 및 <i class="highlight"> 및 </i> 로 각 단어의 발생을 색상합니다.getScore() 결과의 상대 (각 프로젝트에서 검색 쿼리 및 각 프로젝트에서 사용 가능한 데이터에 따라 다른 문맥 상)을 반환합니다 (이 매개 변수에 따라 결과는 자동으로 정렬됩니다).getEntity() 교리가 내부적으로 생산 된 원래 발견 된 실체를 반환합니다. 검색은 부분 선택을 사용하여 수행되므로 모든 속성을 항상 사용할 수있는 것은 아닙니다.entityToArray() 는 배열로 반환합니다. 문자열은 자동으로 정규화됩니다. 결과를 얻는 방법 ( getItems() 및 getItemsOfType() )는 매개 변수 $limit (기본값 10 ) 및 $offset (기본 0 )을 수락합니다.
페이징 자체는 Nette Pagination을 사용하여 가장 잘 구현됩니다.
총 결과 수는 SearchResult 엔티티 위의 getCountResults() 메소드에 의해 얻어집니다.
검색 엔진은 PARTIAL 으로 데이터베이스 엔티티를로드하고 결과 엔티티를 검색 결과로 랩핑하므로 특정 검색 결과 위의 ->getEntity() 를 호출하여 언제든지로드 할 수 있습니다.
결과를 찾을 수 없거나 그 숫자가 "작은"(정의는 특정 프로젝트의 분석에 따라 알고리즘 자체에 의해 결정됨) 인 경우 검색 쿼리의 최상의 수정을위한 팁은 사용할 수 있습니다.
도움말을 보려면 SearchResult 통해 getDidYouMean() 메소드로 전화하십시오. 출력은 문자열 (더 나은 검색 쿼리) 또는 NULL입니다.
최상의 검색 쿼리 수정은 기계 학습 방법을 사용하여 각 프로젝트 내 고급 검색 분석을 기반으로 검색 엔진 자체에서 얻습니다. 각 검색마다 검색 쿼리에 대한 통계, 결과 수 및 기타 신호가 필요한 경우 후 향적으로 자동 저장 및 분석됩니다.
도움을받는 것은 자연스럽고 쉽게 영향을받을 수 없습니다. 검색 엔진은 최대의 객관성을 위해 노력하고 다른 사람을 검색하고 현재 컨텍스트에 따라 가능한 한 많은 관련 결과를 반환하는 사용자 단어를 제공합니다. 내부적으로 복잡한 수학적 기능이 사용되며, 모든 프로젝트의 경험에 따라 지속적으로 개선하고 있습니다.
검색 할 때 검색 결과 후보 목록이 먼저 컴파일됩니다. 이러한 결과는 0 512 에서 자동 "상대"평가를 수행하는 평가 알고리즘을 개별적으로 전달합니다 (검색 쿼리, 최근 사용자 이력, 언어, 물리적 위치, 엔티티 콘텐츠 및 유형과 같은 다양한 신호를 기반으로합니다 (결과는 항상 int ).
포인트 평가에 따르면 결과는 자동으로 정렬됩니다.
IScoreCalculator 인터페이스를 구현하고 DIC 컨테이너에 덮어 쓰면 스코어링 알고리즘을 무시할 수 있습니다.
baraja-core/doctrine-fulltext-search MIT 라이센스에 따라 라이센스가 부여됩니다. 자세한 내용은 라이센스 파일을 참조하십시오.