Порядок FREETEXTTABLE результат UNIONed со стандартным SELECT по рангу

StackOverflow https://stackoverflow.com/questions/1202201

Вопрос

У меня был рабочий запрос FREETEXTTABLE, который искал @searchString. Теперь мне нужно ОБЪЕДИНИТЬ это с помощью другого простого запроса, который пытается проанализировать @searchString в INT, и, если это удается, фильтрует таблицу путем поиска строки с PK, равным parse @searchString.

Раньше я мог легко присоединить результат FREETEXTTABLE к таблице, которую он искал, упорядочить по рангу, но только ВЫБРАТЬ столбцы исходной таблицы, в которой был произведен поиск.

Теперь, когда я объединяю уникальные результаты между запросом текстового поиска и запросом на поиск строки со строкой поиска в качестве ключа, у меня больше нет доступа к рейтингу из запроса текстового поиска.

Как я могу поддерживать упорядочение по рангу полнотекстового поиска, но размещать результат запроса, ища строку с первичным ключом (если он имеет результат), ДО полнотекстового поиска?

Это было полезно?

Решение

Вы пытались просто добавить константу в свой союз, которая ставит ваше точное соответствие PK в верхнюю часть списка? Я не могу вспомнить, что возвращает столбец RANK в свободном тексте (я думаю, от 0 до 1000), но что-то вроде этого сработает, если вы просто сделаете свою константу выше вершины ранга.

DECLARE @id int

IF ISNUMERIC(@myStringId) = 1
    SET @id = CAST(@myStringId AS int)
ELSE
    SET @id = 0

WITH MyFreetextCte as (SELECT   [Rank], 
                                [Key]
                       FROM     FREETEXTTABLE(...)
                       UNION
                       SELECT   1001, 
                                (SELECT MyBaseTable.PK FROM MyBaseTable WHERE PK = @id))
SELECT    *
FROM      MyFreetextCte JOIN MyBaseTable ON MyFreetextCte.[Key] = MyBaseTable.PK
ORDER BY  MyFreetextCte.Rank DESC

Другие советы

С огромной помощью Скотта, вот что у меня наконец получилось:

CREATE PROCEDURE dbo.testProcedure
(
    @searchPhrase nvarchar(500)
)

AS

DECLARE @id int
SET @id = 0;
BEGIN TRY
    SET @id = CAST(@id AS int)
END TRY
BEGIN CATCH 
END CATCH;
-- at this point, @id will be the primary key if it is only digits
-- otherwise it will default to zero (which is out of range of my identity PK)

WITH ftsTable AS (
    SELECT RANK, [KEY] FROM FREETEXTTABLE(sourceTable, *, @searchPhrase)
    UNION
    SELECT 1001, (SELECT sourceTableID FROM sourceTable WHERE sourceTableID = @id)
)   

SELECT sourceTable.*
FROM ftsTable JOIN sourceTable ON ftsTable.[KEY] = sourceTable.sourceTableID
ORDER BY ftsTable.RANK DESC
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top