【问题标题】:Full text search VS Fuzzy Search based on many columns基于多列的全文搜索 VS 模糊搜索
【发布时间】:2021-05-07 02:05:14
【问题描述】:

我有一个包含这些列的 Employee 表:

  • 员工编号
  • 全名
  • 电话
  • 部门
  • 团队
  • 功能
  • 经理

我有一个带有搜索文本输入的表单,用户可以在其中键入一列或所有列,例如:

  • 用户只能按全名搜索
  • 用户可以通过全名+电话+团队组合搜索

在这种情况下,SQL Server 中的全文搜索和模糊搜索有什么区别?

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

所以你必须选择:

  1. 使用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');

阅读更多关于不同的全文搜索选项here

  1. 使用搜索查询。再次女巫,您可以从计算列中受益或分别在每列中搜索:
select *
from tablename
where (Fullname like '%'+@fullNameSearchString+'%' or @fullNameSearchString is null)
and (Department = @DepartmentSearchString or @DepartmentSearchString is null)
and ...

虽然第一种方法是搜索 insode 字符串的更快方法,但第二种方法提供更准确的结果。但是“FreeText”也会查找单词的含义,在这种情况下它可能会更慢。

在第二种方法中,无论您采用哪种方式(使用或不使用计算列),都需要在列上设置索引以提高性能,但是使用类似 '%%' 通常不能使用索引应该。

【讨论】:

    【解决方案2】:

    创建存储过程并通过列逗号分隔检查此示例:

      CREATE Procedure [dbo].Create_Sp
        @SearchColumn  varchar(500)=null
      AS 
      BEGIN 
        
        DECLARE @SQL nvarchar(max)    
        
        SELECT @SQL = N'select '+@SearchColumn+' from #Employee'
        
        EXECUTE sp_executesql @SQL
      End
    

    【讨论】:

      【解决方案3】:

      我们知道,模糊文本和全文之间的主要区别在于“正是我要查找的内容”与“相似性”。这适用于 SQL Server 和您给出的示例,是对名字进行全文搜索,而不是在三个不同的列中挖掘相似性,这可能会产生很多噪音,具体取决于您的数据有多干净或如何“引导”最终用户体验就输入这些值而言。

      通过全名全文搜索,我很确定这是一个直截了当的答案:

      SELECT * FROM tblEmployee WHERE FullName=@FullNamParameter;
      

      使用模糊搜索,它会变得非常恶心和讨厌,因为没有更清楚地了解 UI 正在做什么,我不得不假设我们想要检查所有字段的所有参数的相似性。老实说,我很确定这个查询绝对是最糟糕的,但它确实向您展示了这个想法。

      SELECT * FROM tblEmployee WHERE FullName LIKE '%'+@Parameter1+'%'
      UNION
      SELECT * FROM tblEmployee WHERE FullName LIKE '%'+@Parameter2+'%'
      UNION
      SELECT * FROM tblEmployee WHERE FullName LIKE '%'+@Parameter3+'%'
      UNION
      SELECT * FROM tblEmployee WHERE Phone LIKE '%'+@Parameter1+'%'
      UNION
      SELECT * FROM tblEmployee WHERE Phone LIKE '%'+@Parameter2+'%'
      UNION
      SELECT * FROM tblEmployee WHERE Phone LIKE '%'+@Parameter3+'%'
      UNION
      SELECT * FROM tblEmployee WHERE Team LIKE '%'+@Parameter1+'%'
      UNION
      SELECT * FROM tblEmployee WHERE Team LIKE '%'+@Parameter2+'%'
      UNION
      SELECT * FROM tblEmployee WHERE Team LIKE '%'+@Parameter3+'%'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-19
        • 2020-05-07
        • 2020-05-06
        • 2011-08-27
        • 1970-01-01
        • 2017-03-31
        • 1970-01-01
        相关资源
        最近更新 更多