Isk*_*iot 5 t-sql sql-server full-text-search sql-server-2008
我正在使用SQL Server 2008进行项目,我认为全文搜索是最好的选择。我一直在尽可能多地阅读它,并且几乎了解如何为单个表设置它。但是我不完全确定如何根据自己的情况进行设置-想象以下表结构:
书
- Id
- Title
- Description
Run Code Online (Sandbox Code Playgroud)
图书作者
- BookId
- AuthorId
Run Code Online (Sandbox Code Playgroud)
作者
- Id
- Name
Run Code Online (Sandbox Code Playgroud)
如您所见,数据库包含一个包含书籍的表格,每本书可以没有作者,也可以只有一个作者。每个作者也可以是一本书或一本书或多本书的一部分-即Book和Author表具有多对多关系,由链接表处理BookAuthor。
在这一点上,我想要完成的是一个搜索工具,用于根据用户提供的搜索字符串来查找匹配的书籍。因此,如果用户输入,Brown我希望找到以下两列中包含单词的所有书籍Brown:
Book.Title
Book.Description
Author.Name
Run Code Online (Sandbox Code Playgroud)
本质上,我想要一组结果书籍,包括带标题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')
Run Code Online (Sandbox Code Playgroud)
另一种选择是利用可以在索引视图上创建 FTS 索引这一事实。为此,请创建一个索引视图,其中包含 Book 表中的 Title 字段和 Author 表中的 Name 字段,然后在视图中的这两列上创建 FTS 索引。然后您可以针对该视图编写查询,如下所示:
select BookId, Title from vw_BooksAndAuthors
where contains(([Description], [Name]), 'brown')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
911 次 |
| 最近记录: |