2017-05-19 8 views
0

GOAL : 가능한 경우 서로 다른 검색 열 값과 순서를 가진 결과를 반환하려면 RANK을 입력하십시오.FREETEXTABLE을 사용하여 여러 열을 검색 할 때

규칙 :

  1. 어떤 열이
  2. 결과 전달 null하지 않는는 해당 열에 모든 검색 문자열을 포함 해야합니다, 검색 할 수 있도록 허용
  3. 모든 검색 IF 문자열이 null이면 빈 결과가 반환됩니다.

현재 저장 프로 시저 :

내가 위에서 언급 한 규칙을 준수하기 위해 많은 연구 후에이 가지고 올 수 있었다.

ALTER PROCEDURE [Application].[usp_Institution_Search] 
    @RowCount INT = 100, 
    @Name NVARCHAR(255), 
    @City NVARCHAR(255), 
    @Country NVARCHAR(255) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF ISNULL(@Name, '') = '' SET @Name = '""' 
    IF ISNULL(@City, '') = '' SET @City = '""' 
    IF ISNULL(@Country, '') = '' SET @Country = '""' 

    SELECT TOP (@RowCount) 
     [i].* 
    FROM 
     [dbo].[Institutions] [i] 
    WHERE 
     ((NULLIF(@Name, '""') IS NULL OR FREETEXT([i].[InstitutionName], @Name)) 
     AND (NULLIF(@City, '""') IS NULL OR FREETEXT([i].[City], @City)) 
     AND (NULLIF(@Country, '""') IS NULL OR FREETEXT([i].[Country], @Country)) 
     AND 
     (
      NULLIF(@Name, '""') IS NOT NULL 
      OR NULLIF(@City, '""') IS NOT NULL 
      OR NULLIF(@Country, '""') IS NOT NULL) 
     ) 
END 

문제 : 나는 InstitutionName으로 결과를 정렬하려고했지만 나는 대신 RANK 사용에 대한 생각했다. 더 많은 연구를 한 후 FREETEXTTABLE을 사용하는 것이 가장 좋음을 발견했습니다. 이 시점에서 대부분의 결과가 항상 여러 열에 대해 하나의 문자열을 검색하는 것에 대해 이야기하면서 상황에 가장 잘 대처하는 방법을 잘 모르겠습니다.

나는 이것이 어떻게 작동하는지 완전히 확신하지는 않지만, 가장 높은 조합을 모든 열의 검색에서 합치는 것으로 가정합니다. RANK.

가능하다면 몇 가지 예를 보여주세요.

답변

0

많은 테스트를 마친 후에 나는이 결과를 좋아한다고 생각합니다. 나는 을 요구하고 나머지는 column (InstitutionName)이고 LEFT OUTER JOIN입니다. 그런 다음 순위를 ORDER BY에 합치십시오.

가능한 한 효율적인지 확실하지 않습니다. 누군가가 어떤 의견을 가지고 있다면, 나는 항상 더 많은 것을 배우고 싶어서 당신의 의견을 듣고 싶습니다.

ALTER PROCEDURE [Application].[usp_Institution_Search] 
    @RowCount INT = 100, 
    @Name NVARCHAR(255), 
    @City NVARCHAR(255), 
    @Country NVARCHAR(255) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF ISNULL(@Name, '') = '' SET @Name = '""' 
    IF ISNULL(@City, '') = '' SET @City = '""' 
    IF ISNULL(@Country, '') = '' SET @Country = '""' 

    SELECT TOP (@RowCount) 
     [i].* 
    FROM 
     [dbo].[Institutions] [i] 
     INNER JOIN FREETEXTTABLE([Institutions], [InstitutionName], @Name) AS [ft1] ON [ft1].[Key] = [i].[InstitutionId] 
     LEFT OUTER JOIN FREETEXTTABLE([Institutions], [City], @City) AS [ft2] ON [ft2].[Key] = [i].[InstitutionId] 
     LEFT OUTER JOIN FREETEXTTABLE([Institutions], [Country], @Country) AS [ft3] ON [ft3].[Key] = [i].[InstitutionId] 
    ORDER BY 
     [ft1].[Rank] + ISNULL([ft2].[Rank], 0) + ISNULL([ft3].[Rank], 0) DESC 
     , [i].[InstitutionName] ASC 
END