0

私は全文検索機能が初めてです。だから私はいくつかの助けが必要です。

問題は、ms sql server 2008 r2 の全文検索でカスタム ランキングを設定できるかどうかです。カスタムランキングで私が理解していること:つまり、本をデータベースに保存します。検索用語が Book1 の書籍名と Book2 の説明で一致し、名前が説明よりも優先される場合、Book1 が最初のレコードとして表示されます。

前もって感謝します!

4

1 に答える 1

1

はい、独自に作成することは可能ですが、大規模なパフォーマンスを保証するものではないため、現実的なデータでテストしてください。アイデアは、フィールドを個別にクエリし、独自のカスタム ランキングを追加して、結果を結合することです。

 create table DoNotBlindlyRunMe.books 
 (
 id int not null identity primary key,
 Title varchar(100) not null,
 Author varchar(100) not null,
 [Description] varchar(500) not null
 )
 go
 CREATE FULLTEXT CATALOG [ft_books] WITH ACCENT_SENSITIVITY = ON
 GO
 --You need to edit this to match your PK index name!
 CREATE FULLTEXT INDEX ON [dbo].[books] KEY INDEX [PK__books__3213E83F3D5E1FD2] ON ([ft_books]) WITH (CHANGE_TRACKING AUTO)
 GO
 ALTER FULLTEXT INDEX ON [dbo].[books] ADD ([Author] LANGUAGE [English])
 GO
 ALTER FULLTEXT INDEX ON [dbo].[books] ADD ([Description] LANGUAGE [English])
 GO
 ALTER FULLTEXT INDEX ON [dbo].[books] ADD ([Title] LANGUAGE [English])
 GO
 ALTER FULLTEXT INDEX ON [dbo].[books] ENABLE
 GO

 insert into books (title, author, description)
 values ('The Cat in the Hat',     'Dr. Suess',     'An epic tale of a cat who teaches some valuable lessons.'),
 ('The Little Engine that Could',     'Watty Piper','A small train goes over a mountain.'),
 ('Favorite Nursery Rhymes by Mother Goose', 'Cat Stevens',     'Fairy tales from mother good, including peter piper.')

 --Rank Title highest, then Author, then description
 select [key], min([RANK]) [RANK] from (
      select [key], 100000000+ [RANK] RANK from containstable([books], [Title] , 'cat') union all
      select [key], 200000000+ [RANK] from containstable([books], [Author] , 'cat') union all
      select [key], 300000000+ [RANK] from containstable([books], [Description] , 'cat')
      ) ranked_containstable  GROUP by [key] order by MIN( [RANK] )

 --Or as a TVF
 go
 CREATE FUNCTION  DoNotBlindlyRunMe.RankedBookSearch (@ftQuery nvarchar(500))
 returns table return
 (
 select [key], min([RANK]) [RANK] from (
      select [key], 100000000+ [RANK] RANK from containstable([books], [Title] , @ftQuery) union all
      select [key], 200000000+ [RANK] from containstable([books], [Author] , @ftQuery) union all
      select [key], 300000000+ [RANK] from containstable([books], [Description] , @ftQuery)
      ) ranked_containstable  GROUP by [key]
 )
 go

 select * from dbo.RankedBookSearch(N'cat or stevens or piper')
于 2012-12-04T21:40:39.683 に答える