SQL Server ищет несколько столбцов с помощью FREETEXTABLE
ЦЕЛЬ: вернуть результат, основанный на поиске 3 различных столбцов, каждый со своим собственным значением строки поиска и упорядочить по RANK
, если возможно.
ПРАВИЛА:
- Разрешить поиск в любом столбце
- Результаты должны содержать все строки поиска в соответствующем столбце, если только
null
передается - ЕСЛИ все строки поиска
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