2012-12-04 140 views
0

我是新來的全文搜索功能。所以我需要一些幫助。sql server全文搜索排名

問題是是否可以在全文搜索ms sql server 2008 r2中設置自定義排名? 我在自定義排名下的理解是: 即我們以db的形式存儲書籍。如果在Book1的書名稱和Book2的描述中滿足搜索項,並且名稱優先於描述,則Book1應該顯示爲第一條記錄。

在此先感謝!

+0

你期待什麼答案?我可以說「是」,但恐怕你會感到沮喪......迄今爲止你做了什麼?你準確地粘在哪裏? – jazzytomato

+0

我只是在研究可​​能的解決方案。是的,你的答案讓我感到驚訝,因爲我還沒有找到信息或教程如何調整SQL Server的自定義排名。如果你知道這樣的教程,請分享) – user1178399

回答

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')