ランクによる標準SELECTとUNIONされたFREETEXTTABLE結果の順序付け
-
05-07-2019 - |
質問
@searchStringを検索する有効なFREETEXTTABLEクエリがありました。 @searchStringを解析してINTにしようとする別の簡単なクエリでそれをUNIONする必要があります。成功した場合は、parse @searchStringと等しいPKを持つ行を探してテーブルをフィルタリングします。
以前は、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
所属していません StackOverflow