Question

J'avais une requête FREETEXTTABLE qui recherchait un @searchString. Il me faut maintenant UNION avec une autre requête simple qui essaie d'analyser @searchString dans un INT et, le cas échéant, filtrant la table en recherchant la ligne avec PK égale à l'analyse @searchString.

Auparavant, je pouvais facilement associer le résultat FREETEXTTABLE à la table dans laquelle il effectuait une recherche, en ordre de classement, mais uniquement en sélectionnant les colonnes de la table d'origine recherchée.

Maintenant que je combine les résultats uniques entre la requête de recherche de texte et la requête de recherche de la ligne avec la chaîne de recherche comme clé, je n'ai plus accès au classement de la requête de recherche de texte.

Comment puis-je conserver l'ordre de classement de la recherche en texte intégral en plaçant le résultat de la requête à la recherche de la ligne avec la clé primaire (si elle a un résultat) AVANT les résultats de la recherche en texte intégral?

Était-ce utile?

La solution

Avez-vous essayé d’ajouter à votre syndicat une constante qui place votre correspondance exacte du PK en haut de la liste? Je ne me souviens pas spontanément de ce que la colonne R & R freetext renvoie (0 à 1 000, je pense), mais quelque chose comme cela fonctionnerait si vous aviez juste fait que votre constante soit plus élevée que le haut du classement.

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

Autres conseils

Avec une tonne d'aide de Scott, voici ce que j'ai qui fonctionne finalement:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top