问题确实存在两个部分:
1)如何将CONTAINSTABLE()
与一堆内连接一起使用?
假设有两个表:
Item (ItemID, CategoryID, Name)
Category (CategoryID, ParentCategoryID, Name)
使用“哑”like
搜索,如下所示:
create view [db].[vItem]
as
select i.*, c1.Name as SubCategory, c2.Name as Category, c3.Name as Department
from Item i
inner join category c1 on(c1.CategoryID=i.CategoryID)
inner join category c2 on(c1.ParentCategoryID=c2.CategoryID)
inner join category c3 on(c2.ParentCategoryID=c3.CategoryID)
然后做:
select *
from vItem
where (Name like '%[word 1]%' or SubCategory like '%[word 1]%' or Category like '%[word 1]%' or Department like '%[word 1]%') [and ... word n]
我可以在CONTAINSTABLE()
上删除视图和内连接4次但是那个a)很难b)不一样(每个关键表都需要包含所有搜索项才能获得任何结果)
2)如何在查询语言中使用以上所有内容。
再说一次,假设我只使用like
方法 - 它非常简单。
from i in db.VItem
where i.Name.Contains("word 1") ...
如何使用全文搜索来完成此操作?
答案 0 :(得分:1)
对于第1部分):将您的视图创建为indexed view
create unique clustered index vItem_ItemID
on db.vItem(ItemID)
然后create the fulltext index在该视图的列而不是基表上。
create fulltext index on db.vItem
(Name, SubCategory, Category, Department)
key index vItem_ItemID
创建后,您可以:
select v.*
from containstable(db.vItem, *, '"word 1"') ct
inner join db.vItem v
on ct.[key] = v.ItemID
我必须留下第2部分给别人,因为我没有什么linq经验。