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