【问题标题】:full text index + joins + linq : how to do this properly?全文索引+连接+ linq:如何正确地做到这一点?
【发布时间】:2010-09-03 17:41:45
【问题描述】:

所以这个问题真的有两个部分:

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

全文搜索如何做到这一点?

【问题讨论】:

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


    【解决方案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 经验。

    【讨论】:

    • 所以我无法使用 Item 和 Category 表中已有的全文索引?
    • 你可以,但这就是你所说的“fugly”技术。从长远来看,我认为这对于可读性和性能来说都是可取的。
    猜你喜欢
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    相关资源
    最近更新 更多