我正在开发一个使用SQL Server 2008的项目,我相信全文搜索是最好的方法。我一直在阅读它,并且非常了解如何为单个表设置它。但是我不完全确定如何使用我的场景设置它 - 想象下面的表结构:
图书
- Id
- Title
- Description
BOOKAUTHOR
- BookId
- AuthorId
作者
- Id
- Name
如您所见,数据库中包含一个包含书籍的表格,每本书都可以没有,一个或多个作者。每个作者也可以是无,一本或多本书的一部分 - 即Book
和Author
表具有多对多关系,使用链接表BookAuthor
处理。
此时我想要完成的是一种搜索工具,可根据用户提供的搜索字符串查找匹配的书籍。因此,如果用户输入Brown
,我会想要查找以下任一列包含单词Brown
的所有图书:
Book.Title
Book.Description
Author.Name
从本质上讲,我想要一套书籍结果,包括标题为Brown Bear
的书籍和作者Dan Brown
撰写的书籍。如果有任何关于我应该如何设置的建议,我真的很感激您的意见!
(作为旁注,一旦我进行了此过滤,查询结果也需要是可排序和可分页的,通过@SortOrder
,@PageIndex
和@PageSize
进行处理传入存储过程 - 但我想这可能是一个单独的问题!)
答案 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')