原文转载自:http://blog.csdn.net/yangyuankp/article/details/8085460
为了更好的扩充本算法的适用范围,特加入必要关键词指定功能。
在实际应用中,很可能希望匹配的时候必须出现某个词,否则就是没有意义的匹配。
说到这,读者可能觉得这些需求小题大做,在程序中用正则表达式很容易实现,再次重申,现在的矛盾是我们不能把记录返回到程序中处理,因为涉及到大数据量,必须考虑服务器承受能力、并发访问数量、网络传输能力、程序处理能力等诸多因素。在服务器端尽量缩小数据范围,减少数据传输量,无疑是最佳选择。
这个版本加入的新特性即必要关键词指定,同样拿“如何在CSDN网站注册用户”这句话来说,“CSDN”这个词可以认为是必要词,因为它是前提,试想你在搜索“如何在CSDN网站注册用户”时,却出现了“如何在网易注册用户”,显然是毫无意义的结果。
事实亦如此,地球人也是这么做的,在百度搜“如何在CSDN网站注册用户”,把结果从第一页翻到最后一页,可以发现每一个结果中都可以找到“CSDN”字眼。
其实,大多数情况下,通过贪婪加权匹配,已经可以实现非常重要的词“必然”出现,但有时候需要做一个保证,让结果更加合理。
SQLLIKE语句多条件贪婪加权匹配(新增必要词功能):
GO CREATE function Get_StrArrayLength ( @str varchar(1024), --要分割的字符串 @split varchar(10) --分隔符号 ) returns int as begin declare @location int declare @start int declare @length int set @str=ltrim(rtrim(@str)) set @location=charindex(@split,@str) set @length=1 while @location<>0 begin set @start=@location+1 set @location=charindex(@split,@str,@start) set @length=@length+1 end return @length end GO CREATE function Get_StrArrayStrOfIndex ( @str varchar(1024), --要分割的字符串 @split varchar(10), --分隔符号 @index int --取第几个元素 ) returns varchar(1024) as begin declare @location int declare @start int declare @next int declare @seed int set @str=ltrim(rtrim(@str)) set @start=1 set @next=1 set @seed=len(@split) set @location=charindex(@split,@str) while @location<>0 and @index>@next begin set @start=@location+@seed set @location=charindex(@split,@str,@start) set @next=@next+1 end if @location =0 select @location =len(@str)+1 --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。 return substring(@str,@start,@location-@start) end GO CREATE PROCEDURE proc_Common_SuperLike --要查询的表的主键字段名称 @primaryKeyName varchar(999), --要查询的表名 @talbeName varchar(999), --要查询的表的字段名称,即内容所在的字段 @contentFieldName varchar(999), --查询记录的个数(TOP *),匹配的个数越多,排名越靠前 @selectNumber varchar(999), --匹配字符分隔标记 @splitString varchar(999), --匹配字符组合字符串 @words varchar(999) AS declare @sqlFirst varchar(999) declare @sqlCenter varchar(999) declare @sqlLast varchar(999) declare @next int declare @arrayLength int declare @newWords varchar(999) declare @newTable varchar(999) BEGIN set @newTable=@talbeName set @newWords=@words set @next=dbo.Get_StrArrayLength(@words,'[') --判断是否有必要词 if @next>1 begin set @newTable='' --构造必要表sql语句 while @next>1 begin set @newTable=@newTable+@contentFieldName+' like ''%'+dbo.Get_StrArrayStrOfIndex(dbo.Get_StrArrayStrOfIndex(@words,'[',@next),']',1)+'%'' AND ' set @next=@next-1 end set @newTable=left(@newTable,(len(@newTable)-4)) --构造临时表 set @newTable='SELECT * into ##tempTable FROM '+ @talbeName + ' WHERE ' + @newTable execute(@newTable) --指定临时表 set @newTable='##tempTable' --去掉关键词组中的必要词标记 set @newWords=REPLACE(REPLACE(@words,'[',''),']','') end set @sqlCenter='' set @next=1 set @arrayLength=dbo.Get_StrArrayLength(@newWords,@splitString) while @next<=@arrayLength begin --构造sql查询条件(中间部分) set @sqlCenter = @sqlCenter+'SELECT '+@primaryKeyName+','+CONVERT(varchar(999),@arrayLength-@next+1)+' AS wordPower FROM '+@newTable+' WHERE '+@contentFieldName+' like ''%'+dbo.Get_StrArrayStrOfIndex(@newWords,@splitString,@next)+'%'' UNION ALL ' set @next=@next+1 end --处理sql语句中间部分,去除最后无用语句 set @sqlCenter=left(@sqlCenter,(len(@sqlCenter)-10)) --构造sql语句开头部分 set @sqlFirst='SELECT TOP '+@selectNumber+' '+@primaryKeyName+',COUNT(*)+SUM(wordPower) AS finalPower FROM (' --构造sql语句结尾部分 set @sqlLast=') AS t_Temp GROUP BY '+@primaryKeyName+' ORDER BY finalPower DESC' --拼接出完整sql语句,并执行 Execute(@sqlFirst+@sqlCenter+@sqlLast) --判断临时表是否存在,存在则删除,一定要删除! if OBJECT_ID('tempDb..##tempTable') is not null begin drop table ##tempTable end END
调用方法基本不变(参数个数未变):
execute proc_Common_SuperLike'id','t_test','content','20','|','[i]|o|c'
新特性说明:
定义:把必须要出现的关键词用方括号[]括起来。例如[i]|o|c,则i在结果中必须出现。
说明:假如需要匹配a、b、c三个关键词,重要性:a>b>c,那么可以这样写:a|b|c,这样已经保证a、b、c的权重依次降低,贪婪加权的算法基本可以保证:尽可能多的去匹配、尽可能匹配包含a的记录。但是某些时候为了提高准确性,要求结果中必须出现a,那么可以这样写:[a]|b|c。同理,必须出现a、b可以这样写:[a]|[b]|c。
其他:此次更新加入了临时表技术,保证必要关键词指定效率。
相关推荐
很多时候,由于客户不擅长使用搜索功能,一上来提问,而这些问题往往早已经有近乎完美的答案,但没有充分利用。这样一来,不仅加大了劳动量,又增加了数据冗余。 如果在提问的时候能充分调动历史数据,提交问题...
OracleSqlConvert4MysqlSqlTool.java这个源码工具,根据描述,应该是实现了自动读取Oracle SQL语句,分析其结构,并根据MySQL的语法规则进行转换,然后将转换后的SQL语句保存到指定的目标文件中。这个工具简化了手动...
根据提供的文件信息,我们可以深入探讨如何通过条件拼接来构造SQL查询语句,这在实际开发中极为常见。 ### SQL语句拼接的基础概念 SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言,其主要...
知识点:Like 语句可以使用通配符,例如 %、_、[] 等来指定模式。 6. 空值 NULL 查询:使用 IS NULL 语句可以查询空值记录,例如 Select * from 职工 where 性别 is null。 知识点:IS NULL 语句可以判断记录是否...
在压缩包子文件的文件名"ms转sql语句.exe"中,我们可以推测这可能是一个用于将SQL Server语句转换为Oracle兼容格式的可执行程序。这样的工具通常会提供用户友好的界面,让用户导入SQL Server的数据库元数据,然后...
然而,在某些情况下,我们需要将这些表达式转换为实际的SQL语句,以便在数据库中执行。本文将深入探讨如何实现这一过程。 首先,我们需要了解Lambda表达式的基本结构。Lambda表达式通常以参数列表开始,后面跟着一...
SQL中的SELECT LIKE语句是用来在字符型字段中进行模糊搜索的,这在处理大量文本数据时非常有用。LIKE关键字结合通配符可以帮助我们构建灵活的查询条件,以找到符合特定模式的数据。 首先,LIKE语句的基本语法是: ...
本文档总结了基础常用的SQL语句,涵盖了MYSQL基础语句、数据库创建、数据表创建、数据插入、查询、更新、删除、子句、连接、NULL值处理、正则表达式、ALTER命令、服务器元数据、MYSQL及SQL注入、MYSQL导出数据等多个...
根据提供的文件信息“附件3:SQL语句.txt”及其部分内容,我们可以深入探讨SQL中的删除(DELETE)语句和事务提交(COMMIT)命令,这两个关键概念对于理解SQL语句的操作流程至关重要。 ### SQL DELETE语句 DELETE...
11. SQL LIKE 操作符 15 12. SQL 通配符 16 13. SQL IN 操作符 18 14. SQL BETWEEN 操作符 18 15. SQL Alias(别名) 19 16. SQL JOIN 20 17. SQL INNER JOIN 关键字 22 18. SQL LEFT JOIN 关键字 23 19. SQL RIGHT ...
- **查找**:例如,`SELECT * FROM table1 WHERE field1 LIKE '%value1%'`,这里的LIKE运算符允许进行模式匹配。 - **排序**:如`SELECT * FROM table1 ORDER BY field1, field2 DESC`,DESC表示降序排列。 - **聚合...
SQL Server 常用语句大全 本资源摘要信息涵盖了 SQL Server 中常用的语句大全,包括数据操作、数据定义、数据控制、事务控制、程序化 SQL 等方面的知识点。 一、数据操作 * SELECT 语句:从数据库表中检索数据行...
SQL语句基础教程 SQL(Structured Query Language)是一种特殊目的语言,用于管理关系数据库管理系统(RDBMS)。SQL语句基础教程旨在帮助新手和需要复习SQL的资料仓储业界老将,学习SQL基础知识和语法。 SQL指令 -...
学习 SQL 语句大全 SQL 语句是数据库管理系统中使用的语言,用于操作和管理数据库。SQL 语句大全ครอบ盖了数据库操作的各个方面,包括数据操作、数据概念、数据操纵、事务操纵、程序化 SQL 等。 数据操作 * ...
### SQL查询语句使用 #### 一、基本概念与结构 在进行数据库操作时,**SQL(Structured Query Language)**是一种极为重要的语言工具,用于...掌握这些基本的SQL查询语句对于任何数据库开发人员来说都是非常必要的。
本篇将详细讲解如何在SQL语句中使用`LIKE`来处理多个条件。 在SQL中,如果你想要根据多个条件来筛选数据,通常会结合`AND`或`OR`操作符来实现。然而,当你想要基于一个字段的多个子串进行匹配时,情况可能会变得...
根据提供的文件信息,我们可以总结出一系列SQL基础知识及实用技巧,主要涵盖了表的创建、数据插入以及数据查询等几个方面。 ### 一、表的创建与结构复制 #### 1. 创建新表并复制已有表的结构 在创建新表时,如果...
- `LIKE`:在查询中用于模式匹配,例如`WHERE field LIKE '%value%'`可以搜索包含"value"的行。 - `ORDER BY`:按一个或多个字段排序结果。 - `COUNT`, `SUM`, `AVG`:分别用于计算行数、总和和平均值。 掌握...