sql - 基于多列的全文搜索 VS 模糊搜索
问题描述
我有一个包含这些列的 Employee 表:
- 员工ID
- 全名
- 电话
- 部门
- 团队
- 功能
- 经理
我有一个带有搜索文本输入的表单,用户可以在其中键入一列或所有列,例如:
- 用户只能按全名搜索
- 用户可以通过组合全名+电话+团队进行搜索
在这种情况下,SQL Server 中的全文搜索和模糊搜索有什么区别?
解决方案
所以你必须选择:
- 使用
full text search
:
如果数据量很大,并且您正在寻找可扩展的数据搜索,则此方法更可取,但更难维护。所以我建议您computed column
在该表中添加一个并在其上放置全文索引:
alter table tablename
add column cmptcolumn as concat_ws(',',EmployeeId,FullName,PhoneNumber,...)
--full text catalog
CREATE FULLTEXT CATALOG catalogName AS DEFAULT;
-- full text index
create full text index on tablename (cmptcolumn)
-- search :
select * from tablename
where contain(cmptcolumn, 'SearchString');
通过全文搜索,您还可以搜索同义词以及彼此相关的单词:
select * from tablename
where freetext(cmptcolumn, 'SearchString');
在此处阅读有关不同全文搜索选项的更多信息
- 使用搜索查询。再次女巫,您可以从计算列中受益或分别在每列中搜索:
select *
from tablename
where (Fullname like '%'+@fullNameSearchString+'%' or @fullNameSearchString is null)
and (Department = @DepartmentSearchString or @DepartmentSearchString is null)
and ...
虽然第一种方法是搜索 insode 字符串的更快方法,但第二种方法提供更准确的结果。但是“FreeText”也会查找单词的含义,在这种情况下它可能会更慢。
在第二种方法中,无论您采用哪种方式(有或没有计算列),都必须在列上建立索引以提高性能,但是使用 like '%%' 通常不能按应有的方式使用索引。
推荐阅读
- kotlin - 如何过滤和排序使用 LiveData 的 RecyclerView(不使用 SearchView)
- tensorflow - 在 keras 中访问 GAN 模型的损失函数中的输入和中间层输出
- python - BeautifulSoup 在服务器上无法正常工作
- python - 将 SQL 查询的结果定义为变量 - Python
- php - Laravel,从 foreach 循环内的另一个表中获取信息
- python - Pandas - 提取具有与数字列表匹配的列的数据框行
- python - 将数据框列与系列相乘
- excel - 在布尔 vba 中重命名图表
- sql-server - 大表更新最佳实践
- spring-boot - Spring boot CrudRepository 将数据插入数据库