Sql server 2008 SQL Server 2k8全文搜索;无关的;使用视图还是?

Sql server 2008 SQL Server 2k8全文搜索;无关的;使用视图还是?,sql-server-2008,full-text-search,full-text-catalog,Sql Server 2008,Full Text Search,Full Text Catalog,我对全文搜索非常陌生,我很想知道跨多个不相关的表执行“站点搜索”式全文搜索的最佳方法(我计划跨4个表执行此操作)。我正在考虑使用这样的视图: CREATE VIEW [dbo].[Search] WITH SCHEMABINDING AS SELECT p.ProductId AS ItemId ,'Product' AS ItemType ,p.Title AS ItemTitle ,p.Lo

我对全文搜索非常陌生,我很想知道跨多个不相关的表执行“站点搜索”式全文搜索的最佳方法(我计划跨4个表执行此操作)。我正在考虑使用这样的视图:

CREATE VIEW [dbo].[Search] WITH SCHEMABINDING
    AS

        SELECT   p.ProductId AS ItemId
            ,'Product' AS ItemType
            ,p.Title AS ItemTitle
            ,p.LongDescription AS LongDescription
            ,p.Price AS Price
    FROM dbo.Product AS p
    WHERE p.IsActive = 1

    UNION

    SELECT   a.ArticleId AS ItemId
            ,'Article' AS ItemType
            ,a.ArticleTitle AS ItemTitle
            ,a.Contents AS LongDescription
            ,NULL AS Price
    FROM dbo.Article AS a
    WHERE a.IsActive = 1
但在研究索引的正确语法时,我意识到“a”我需要一个唯一的索引,“b”显然不能用于创建全文索引

我看到的另一种方法是为每个表创建一个FTI,然后在一个存储过程中,将它们合并到一个tmp表中,然后使用Order By rank选择tmp表

我真的很想得到一些关于这方面的指导,我发现的大部分内容都与多个相关表有关,其中与视图的连接足以克服这个问题

编辑:

@Joe善意地回答了这个我已经忘记并以某种方式解决的问题,但他担心这个问题有点冗长,似乎这可能是他建议的两种方式中最符合逻辑的一种,这就是我正在使用的-我完全忘了我必须将其分页以。。。我不认为客户会对无休止的结果感到兴奋

我的一位同事还提出了他看到的另一种实现技术,即在表中抛出元数据,基本上将结果缓存在另一个表中,然后对其进行全文搜索,如果您知道元数据将是什么,那么这不是一种很糟糕的方法,而且您还需要将其添加到原始表中,以立即获得实际结果或显示实际结果(如果需要,请参阅全文)


返回0

我认为您可以在这里采用两种基本方法:

1) 将四个表聚合到一个表中,并在该表上搜索。此表上的主键需要具有唯一标识符。因此,表结构类似于您正在考虑的索引视图,看起来如下所示:

CREATE TABLE AggregatedTable
(
    Id int IDENTITY(1,1) primary key,
    ItemId int,
    ItemType nvarchar(50),
    ItemTitle nvarchar(255),
    LongDescription nvarchar(max),
    IsActive int
)
然后需要在LongDescription列上创建全文索引

这种方法的优点是,您可以在单个查询中对单个表进行全文搜索,例如:

SELECT Id, ItemId, ItemType, ct.RANK      
    FROM dbo.AggregateTable AS a INNER JOIN 
    CONTAINSTABLE (AggregateTable , *, '(light NEAR aluminum)',   1033) AS ct
        ON a.ItemId= ct.[KEY]
WHERE IsActive = 1
ORDER BY ct.RANK desc
这种方法的缺点是: 1.您必须定期运行作业,将4个基表中的数据加载到聚合表中 2.您将使用两倍的磁盘空间

第二种方法是将数据保存在四个单独的表中,然后编写FTS查询,将四个表的结果合并在一起。您应该能够根据相关性对结果进行排名,然后选择前N个最相关的结果。您必须按如下方式编写查询:

SELECT   p.ProductId AS ItemId, 'Product' AS ItemType, ct.RANK 'Rank'       
    FROM dbo.Product AS p INNER JOIN 
    CONTAINSTABLE (Product, *, '(light NEAR aluminum)',   1033) AS ct
        ON p.ProductId = ct.[KEY]
WHERE p.IsActive = 1
UNION
SELECT   a.ArticleId AS ItemId, 'Article' AS ItemType, ct.RANK  
      CONTAINSTABLE (Article, *, '(light NEAR aluminum)',   1033) AS ct
        ON p.ProductId = ct.[KEY]  
    FROM dbo.Article AS a
    WHERE a.IsActive = 1
    ORDER BY 'Rank' DESC
UNION ... other two tables
这种方法的优点是不需要将四个表中的内容聚合到一个表中的作业

缺点是查询更复杂,因为它们需要合并来自四个查询的结果


我倾向于第二种方法。我认为这更直截了当,更易于维护,而UNION查询的构造也更直截了当。

谢谢您的回答-我希望这会是一个相当好的文档,因为我认为它会在www上被大量使用
SELECT   p.ProductId AS ItemId, 'Product' AS ItemType, ct.RANK 'Rank'       
    FROM dbo.Product AS p INNER JOIN 
    CONTAINSTABLE (Product, *, '(light NEAR aluminum)',   1033) AS ct
        ON p.ProductId = ct.[KEY]
WHERE p.IsActive = 1
UNION
SELECT   a.ArticleId AS ItemId, 'Article' AS ItemType, ct.RANK  
      CONTAINSTABLE (Article, *, '(light NEAR aluminum)',   1033) AS ct
        ON p.ProductId = ct.[KEY]  
    FROM dbo.Article AS a
    WHERE a.IsActive = 1
    ORDER BY 'Rank' DESC
UNION ... other two tables