SQL Server全文搜索 - 多对多关系

时间:2012-03-04 12:21:08

标签: sql-server sql-server-2008 tsql full-text-search

我正在开发一个使用SQL Server 2008的项目,我相信全文搜索是最好的方法。我一直在阅读它,并且非常了解如何为单个表设置它。但是我不完全确定如何使用我的场景设置它 - 想象下面的表结构:

图书

- Id
- Title
- Description

BOOKAUTHOR

- BookId
- AuthorId

作者

- Id
- Name

如您所见,数据库中包含一个包含书籍的表格,每本书都可以没有,一个或多个作者。每个作者也可以是无,一本或多本书的一部分 - 即BookAuthor表具有多对多关系,使用链接表BookAuthor处理。

此时我想要完成的是一种搜索工具,可根据用户提供的搜索字符串查找匹配的书籍。因此,如果用户输入Brown,我会想要查找以下任一列包含单词Brown的所有图书:

Book.Title
Book.Description
Author.Name

从本质上讲,我想要一套书籍结果,包括标题为Brown Bear的书籍和作者Dan Brown撰写的书籍。如果有任何关于我应该如何设置的建议,我真的很感激您的意见!

(作为旁注,一旦我进行了此过滤,查询结果也需要是可排序和可分页的,通过@SortOrder@PageIndex@PageSize进行处理传入存储过程 - 但我想这可能是一个单独的问题!)

1 个答案:

答案 0 :(得分:2)

CONTAINS谓词可以将列的列表作为其第一个参数进行搜索;但是,这些列必须来自单个表。您可以通过几种方法来解决此限制。一种选择是你可以执行两个单独的搜索,每个表上一个,然后将结果联合起来。

select Id, Title from Book where contains([Description], 'brown')
union
select b.Id, b.Title
    from Book b inner join BookAuthor ba on b.Id = ba.BookId
        inner join Author a on a.Id=ba.AuthorId
    where contains([Name], 'brown')

另一种选择是利用FTS indexes can be created on indexed views这一事实。为此,请创建一个索引视图,其中包含Book表中的Title字段和Author表中的Name字段,然后在视图中的这两列上创建FTS索引。然后,您可以按如下方式对此视图编写查询:

select BookId, Title from vw_BooksAndAuthors 
where contains(([Description], [Name]), 'brown')