全文索引+加入+ linq:如何正确地做到这一点?

时间:2010-09-03 17:41:45

标签: sql-server linq-to-sql sql-server-2008 full-text-search

问题确实存在两个部分:

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") ...

如何使用全文搜索来完成此操作?

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经验。