2016-11-25 2 views
1

보기에서 전체 텍스트 검색을 사용하면 해당 비즈니스에 대한 승인 된 모든 비즈니스 & 메타 데이터가 반환됩니다. 나는 비즈니스 이름, 예를 들어 검색하면전체 텍스트 검색 일치 검색 확인 SQL Server

CREATE PROCEDURE [dbo].[Search] 
@SearchTerm varchar(8000), 
@CurrentPage int = 1, 
@PageSize int = 100 

AS 
BEGIN 
    DECLARE @NearPredicate varchar(8000), 
      @AndPredicate varchar(8000), 
      @TotalRecords int 

SELECT 
    @NearPredicate = COALESCE(@NearPredicate + ' NEAR ', '') + Data 
FROM Split(@SearchTerm, ' ') 
    LEFT JOIN sys.fulltext_system_stopwords ON Data = stopword 
WHERE stopword IS NULL 

SET @AndPredicate = REPLACE(@NearPredicate, 'NEAR', 'AND') 
SET @NearPredicate = '(' + @NearPredicate + ')' 

SET @TotalRecords = (
    SELECT 
     COUNT(*) 
    FROM 
     vwApprovedBusiness 
    WHERE FREETEXT(*, @AndPredicate) 
    ) 

SELECT *, 
    ct.Rank, 
    @TotalRecords AS TotalRecords 
FROM 
    vwApprovedBusiness a 
     INNER JOIN FREETEXTTABLE (vwApprovedBusiness, *, @NearPredicate) AS ct ON a.MyBusinessID = ct.[KEY] 
ORDER BY 
    ct.RANK DESC 
OFFSET (@CurrentPage - 1) * @PageSize ROWS FETCH NEXT @PageSize ROWS only 

END 

:

나는 다음과 같은 코드를 사용하여 전체 텍스트 검색을 활용하는 저장 프로 시저를 구현 승인 된 업체 인 Guy Transport은 예상대로 첫 번째 결과가 아닌 약 6 일 또는 7 일 내 검색 결과에만 표시됩니다. 이것에 대한 도움이 있으면 대단히 감사하겠습니다!

+0

이 답인가? http://stackoverflow.com/questions/16130526/sql-server-full-text-search-for-exact-match-with-fallback flups 답변보기 – Lukek

답변

1

전체 텍스트 검색 호출을 FREETEXT/FREETEXTTABLE에서 CONTAINS/CONTAINSTABLE로 변환하는 것이 좋습니다. 정확한 구문 인 비즈니스 이름을 검색 할 때 FREETEXT가 적절하지 않기 때문입니다.

은 포함하고 다음과 같이 FREETEXT는, 경기의 다른 종류에 유용 :

  • 사용에 포함 된 (또는 CONTAINSTABLE) 정확한 또는 퍼지가 (덜 정확) 하나에 일치 에 대한 Query with Full-Text Search MSDN의 문서에 따라 단어 및 구문, 서로 일정 거리 이내의 단어의 근접성 또는 가중치 적용

  • 사용하여 의미를 일치 에 대한 FREETEXT (또는 FREETEXTTABLE),하지만 특정 단어, 구 또는 문장의 정확한 표현,합니다 (자유 텍스트 문자열). 지정된 용어의 전체 텍스트 색인에서 용어 나 형식이 발견되면 일치 항목이 생성됩니다.

따라서 비즈니스 이름을 검색 할 때 정확한 일치를 원할 경우 CONTAINS를 사용해야합니다.

비즈니스 메타 데이터를 검색 할 때 CONTAINS/CONTAINSTABLE의 결과가 거의 없으면 검색 유형을 UI로 나눌 수 있으며 검색은 비즈니스 설명/메타 데이터로 검색 할 때 이름이 FREETEXT 인 경우 CONTAINS를 사용할 수 있습니다. 나는 개인적으로 CONTAINS가 두 경우 모두 괜찮을 것이라고 생각합니다.

또 다른 노트, 쿼리에 별도의 FTS가 @TotalRecords 카운트를 얻기 위해 전화를하지만 당신은 주요 검색 호출에 그 권리를 포함 할 수 있습니다

SELECT *, 
    ct.Rank, 
    -- @TotalRecords AS TotalRecords 
    COUNT(*) over() as TotalRecords 
FROM 
    vwApprovedBusiness a 
     INNER JOIN FREETEXTTABLE (vwApprovedBusiness, *, @NearPredicate) AS ct ON a.MyBusinessID = ct.[KEY] 

HTH

관련 문제