SQL Server ищет несколько столбцов с помощью FREETEXTABLE

ЦЕЛЬ: вернуть результат, основанный на поиске 3 различных столбцов, каждый со своим собственным значением строки поиска и упорядочить по RANK, если возможно.

ПРАВИЛА:

  1. Разрешить поиск в любом столбце
  2. Результаты должны содержать все строки поиска в соответствующем столбце, если только null передается
  3. ЕСЛИ все строки поиска 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 из поиска всех столбцов.

Если это возможно, пожалуйста, покажите мне несколько примеров.

1 ответ

Решение

Поэтому после многих испытаний я думаю, что мне нравится этот результат. я INNER JOINтребуемый 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
Другие вопросы по тегам