NopCommerce (C# MVC オープン ソース E コマース) が「製品」と「バリアント」の全文検索を使用して行ったことを見てきましたが、「製品」のみが返されます。「スレッド」と「返信」を検索したいが、明らかに「スレッド」のみを返したいため、これはあなたのケースと非常に似ています。スレッドと返信を使用するように変更しました。
まず、テーブルごとにインデックス名を生成する関数を作成します (オプション)。
CREATE FUNCTION [dbo].[nop_getprimarykey_indexname]
(
@table_name nvarchar(1000) = null
)
RETURNS nvarchar(1000)
AS
BEGIN
DECLARE @index_name nvarchar(1000)
SELECT @index_name = i.name
FROM sys.tables AS tbl
INNER JOIN sys.indexes AS i ON (i.index_id > 0 and i.is_hypothetical = 0) AND (i.object_id=tbl.object_id)
WHERE (i.is_unique=1 and i.is_disabled=0) and (tbl.name=@table_name)
RETURN @index_name
END
GO
次に、カタログとインデックスを作成してフルテキストを有効にします。
EXEC('
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_catalogs WHERE [name] = ''myFullTextCatalog'')
CREATE FULLTEXT CATALOG [myFullTextCatalog] AS DEFAULT')
DECLARE @create_index_text nvarchar(4000)
SET @create_index_text = '
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id(''[Table_Thread]''))
CREATE FULLTEXT INDEX ON [Table_Thread]([Subject])
KEY INDEX [' + dbo.[nop_getprimarykey_indexname] ('Table_Thread') + '] ON [myFullTextCatalog] WITH CHANGE_TRACKING AUTO'
EXEC(@create_index_text)
SET @create_index_text = '
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id(''[Table_Replies]''))
CREATE FULLTEXT INDEX ON [Table_Replies]([ReplyText])
KEY INDEX [' + dbo.[nop_getprimarykey_indexname] ('Table_Replies') + '] ON [myFullTextCatalog] WITH CHANGE_TRACKING AUTO'
EXEC(@create_index_text)
次に、キーワードで製品を取得するためのストアド プロシージャで、キーワードに一致する製品 ID のリストを含む一時テーブルを作成します。
INSERT INTO #KeywordThreads ([ThreadId])
SELECT t.Id
FROM Table_Thread t with (NOLOCK)
WHERE CONTAINS(t.[Subject], @Keywords)
UNION
SELECT r.ThreadId
FROM Table_Replies r with (NOLOCK)
WHERE CONTAINS(pv.[ReplyText], @Keywords)
これで、一時テーブル#KeywordThreads
を使用してスレッドのリストと結合し、それらを返すことができます。
これが役立つことを願っています。