1

@searchStringを検索するFREETEXTTABLEクエリが機能していました。@searchStringをINTに解析しようとする別の単純なクエリでそれをUNIONする必要があります。成功した場合は、解析@searchStringに等しいPKを持つ行を検索してテーブルをフィルタリングします。

以前は、FREETEXTTABLEの結果を検索対象のテーブルにランク順に簡単に結合できましたが、検索された元のテーブルの列のみを選択していました。

テキスト検索クエリと、検索文字列をキーとして行を検索するクエリとの間の一意の結果を組み合わせているため、テキスト検索クエリからランクにアクセスできなくなりました。

全文検索のランクによる順序を維持しながら、全文検索結果の前に主キー(結果がある場合)のある行を検索するクエリ結果を配置するにはどうすればよいですか?

4

2 に答える 2

0

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
于 2009-07-29T19:00:30.057 に答える
0

スコットからのたくさんの助けを借りて、これは私が最終的に機能するものです:

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
于 2009-07-30T15:46:51.237 に答える