SqlServer2005中文本查询的最佳处理方式

注,本文是我早期工作时写的,主要是个思路问题,结论并不合理。这里仅记录我当时的想法和思路,不该以本文的结论处理在线项目了。其实几种处理方法的优劣,跟实际操作数据量以及硬件等环境有很大关系,数据量叫大的时候,like '%a%'这样的方式相对效率还可以。当然,对于文本处理,全文搜索还有优势,但全文搜索也有一定的局限性,中文的分词方式,的确较复杂,所以具体问题,参考各种方式,还是该具体对待。  

 由于现有的数据服务中,新闻占有比较重要的位置。其中新闻标题或者某段文本的搜索排序,就经常在开发人员的编程中需要使用到。新闻的内容属于字符串类型或者以前的文本类型,可能内容比较长,新闻内容的搜索以及排序的性能就很重要了。如果处理不好,就会对整个服务器的性能产生严重的负面影响。下面我是分析现有的几种对文本搜索和排序的处理方式,比较其性能,选择性能最好的操作方式。 第一种,代码使用like '%文字内容%'来搜索表中的文本字段内容。例如: Select top 100 [NewsTitle],[NewsContent] From NewsContent where NewsTitle like '%最新报道%' 这种代码由于容易理解,开发人员最容易写出来,在现有的代码中也是最常见的操作方式。这段代码,假如要找的是NewsTitle以'最新报道'开头的话,代码就是这样写: Select top 100 [NewsTitle],[NewsContent] From ConTent where NewsTitle like '最新报道%',当然,这个操作是很合理的,只需要在NewsTitle列建立索引,这个句子就可以很好地使用索引,很高效地搜索出数据。这两段代码的差别就在于字符串'最新报道'前面是否有一个'%',执行的性能,却是天壤之别。数据记录根据索引规则重排后的顺序跟当前数据库系统使用的排序规则相关。一般如果按照字符串的先后顺序查找,就可以很好的利用索引,进行快速查找。可是like '%最新报道%'这样不从字符串的开头按照顺序找,就无法使用该字段的索引,查找的效率就很低下。 测试代码如下: declare @time1 datetime declare @mSecond integer set @time1=getdate() SELECT [NewsTitle] --新闻标题 字符串类型 ,[NewsContent]--新闻内容 字符串类型 FROM [news].[dbo].[NewsContent] where newstitle like '%时报%' set @mSecond=datediff(millisecond,@time1,getdate()) --返回消耗的时间(单位:毫秒) select @mSecond [Type1] 结果 ------ Type1 2810 第二种,使用charindex()函数的返回值,来判断每条记录是否包含需要搜索的字符串。代码如同 Select top 100 [NewsTitle],[NewsContent] from NewsContent where charindex('时报',newstitle)>0 这种操作,主要是需要针对数据表中的每条记录都做一次判断,那么应该在记录数越多的情况下,这种方式的性能就越差。记录数少的情况下,效果和第一种接近。我最初用1000多条记录测试的时候,第二种的性能还略好于第一种。但在加大数据量后,其性能下降太快,效率不及第一种处理方式。 测试代码如下: declare @time1 datetime declare @mSecond integer set @time1=getdate() SELECT [NewsTitle] ,[NewsContent] FROM [news].[dbo].[NewsContent] where charindex('时报',newstitle)>0 set @mSecond=datediff(millisecond,@time1,getdate()) select @mSecond [Type2] 结果 -------- Type2 4953 第三种,使用全文搜索。要使用全文索引,先启动服务 SQL Server FullText Search (MSSQLSERVER)。然后开启数据库的全文索引功能(选中数据库->右键->属性->文件 钩选使用全文索引选项)。选择要建立全文索引的表(需要先为该表建立唯一索引,然后才可以建全文索引),鼠标右键->全文索引->定义全文索引。将要查找的字段加入全文搜索范围后,便可以使用全文搜索来查询数据了。 测试代码如下: declare @time1 datetime set @time1=getdate() SELECT [NewsTitle] ,[NewsContent] FROM [news].[dbo].[NewsContent] where contains(newstitle,'时报') set @mSecond=datediff(millisecond,@time1,getdate()) select @mSecond [Type3] 结果 ------- Type3 1330 总结:从上面测试代码中时间消耗可以看出,使用全文索引是三种方法中效率最高的一种。也是能满足大量文本内容中信息提取和搜索的最佳方案。注,本文是我早期工作时写的,主要是个思路问题,结论并不合理。这里仅记录我当时的想法和思路,不该以本文的结论处理在线项目了。其实几种处理方法的优劣,跟实际操作数据量以及硬件等环境有很大关系,数据量叫大的时候,like '%a%'这样的方式相对效率还可以。当然,对于文本处理,全文搜索还有优势,但全文搜索也有一定的局限性,中文的分词方式,的确较复杂,所以具体问题,参考各种方式,还是该具体对待。 SqlServer2005中文本查询的最佳处理方式 王红波 由于现有的数据服务中,新闻占有比较重要的位置。其中新闻标题或者某段文本的搜索排序,就经常在开发人员的编程中需要使用到。新闻的内容属于字符串类型或者以前的文本类型,可能内容比较长,新闻内容的搜索以及排序的性能就很重要了。如果处理不好,就会对整个服务器的性能产生严重的负面影响。下面我是分析现有的几种对文本搜索和排序的处理方式,比较其性能,选择性能最好的操作方式。 第一种,代码使用like '%文字内容%'来搜索表中的文本字段内容。例如: Select top 100 [NewsTitle],[NewsContent] From NewsContent where NewsTitle like '%最新报道%' 这种代码由于容易理解,开发人员最容易写出来,在现有的代码中也是最常见的操作方式。这段代码,假如要找的是NewsTitle以'最新报道'开头的话,代码就是这样写: Select top 100 [NewsTitle],[NewsContent] From ConTent where NewsTitle like '最新报道%',当然,这个操作是很合理的,只需要在NewsTitle列建立索引,这个句子就可以很好地使用索引,很高效地搜索出数据。这两段代码的差别就在于字符串'最新报道'前面是否有一个'%',执行的性能,却是天壤之别。数据记录根据索引规则重排后的顺序跟当前数据库系统使用的排序规则相关。一般如果按照字符串的先后顺序查找,就可以很好的利用索引,进行快速查找。可是like '%最新报道%'这样不从字符串的开头按照顺序找,就无法使用该字段的索引,查找的效率就很低下。 测试代码如下: declare @time1 datetime declare @mSecond integer set @time1=getdate() SELECT [NewsTitle] --新闻标题 字符串类型 ,[NewsContent]--新闻内容 字符串类型 FROM [news].[dbo].[NewsContent] where newstitle like '%时报%' set @mSecond=datediff(millisecond,@time1,getdate()) --返回消耗的时间(单位:毫秒) select @mSecond [Type1] 结果 ------ Type1 2810 第二种,使用charindex()函数的返回值,来判断每条记录是否包含需要搜索的字符串。代码如同 Select top 100 [NewsTitle],[NewsContent] from NewsContent where charindex('时报',newstitle)>0 这种操作,主要是需要针对数据表中的每条记录都做一次判断,那么应该在记录数越多的情况下,这种方式的性能就越差。记录数少的情况下,效果和第一种接近。我最初用1000多条记录测试的时候,第二种的性能还略好于第一种。但在加大数据量后,其性能下降太快,效率不及第一种处理方式。 测试代码如下: declare @time1 datetime declare @mSecond integer set @time1=getdate() SELECT [NewsTitle] ,[NewsContent] FROM [news].[dbo].[NewsContent] where charindex('时报',newstitle)>0 set @mSecond=datediff(millisecond,@time1,getdate()) select @mSecond [Type2] 结果 -------- Type2 4953 第三种,使用全文搜索。要使用全文索引,先启动服务 SQL Server FullText Search (MSSQLSERVER)。然后开启数据库的全文索引功能(选中数据库->右键->属性->文件 钩选使用全文索引选项)。选择要建立全文索引的表(需要先为该表建立唯一索引,然后才可以建全文索引),鼠标右键->全文索引->定义全文索引。将要查找的字段加入全文搜索范围后,便可以使用全文搜索来查询数据了。 测试代码如下: declare @time1 datetime set @time1=getdate() SELECT [NewsTitle] ,[NewsContent] FROM [news].[dbo].[NewsContent] where contains(newstitle,'时报') set @mSecond=datediff(millisecond,@time1,getdate()) select @mSecond [Type3] 结果 ------- Type3 1330 总结:从上面测试代码中时间消耗可以看出,使用全文索引是三种方法中效率最高的一种。也是能满足大量文本内容中信息提取和搜索的最佳方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值