查询反模式 - 全文搜索
一、目标:全文搜索
任何存储文本的应用都有针对这个文本进行单词或词组搜索的需求。我们使用数据库存储越来越多的文本数据,同时也需要搜索速度越来越快。Web应用尤其需要高性能和高扩展性数据库搜索技术。
SQL基本原理就是一列中的单个数据是原子性的。也就是说,当我们对两个值进行比较时,通常是把两个值当成一个整体来比较,在SQL中比较子字符串总是意味着低效和不精确。
二、反模式:模式匹配断言
SQL提供了模式匹配断言来比较字符串,并且这是很多程序员用来搜索关键字的第一选择。最广泛使用的就是LIKE断言。LIKE断言提供了一个通配符(%)用以匹配0个或多个字符。在一个关键字前以及之后使用通配符能够匹配到包含这个挂件子的任意字符串。第一个通配符匹配了关键字之前的所有文本,第二个通配符匹配了关键字之后的所有文本。
SELECT * FROM Article WHERE ArticleContent LIKE '%刘备%'
使用匹配模式操作符最大的缺点就在于性能问题。它们无法从传统的索引上受益,因此必须进行全表扫描。由于对一个字符串列进行匹配操作非常耗时,全表遍历所花的总时间就非常多。
对于英文来说,经常会返回意料之外的结果。比如:
SELECT * FROM Article WHERE ArticleContent LIKE '%one%'
可能会返回money、phone、lonely等。在关键字两端都加上空格也不能完美解决这个问题,因为无法匹配到后面直接跟着标点符号的单词或者正好在文本开头或结尾的单词。
三、合理使用反模式
如果你使用通配符的查询是一个临时查询,那么这是一个非常不错的办法。你能够非常快速地获得返回结果。其次,如果你是为一些非常简单的需求设计这样的模式匹配,它们就能帮助你使用最少的工作量获得正确的结果。
四、解决方案:使用正确的工具
1、使用数据库扩展
几乎所有的数据库厂商都为全文搜索这个需求提供了解决方案,但这些方案并没有任何的标准,各个数据库的实现也不不兼容。如果只使用一种数据库品牌,这些特性就是获得高性能文本搜索的最佳捷径,并且能和SQL查询整合的非常好。其他厂商的并不清楚,但感觉SQL Server的这个东西很弱小。关于SQL Server的全文搜索,可以到这里查看。这里不再述。http://www.cnblogs.com/kissdodog/p/3376346.html
2、使用第三方搜索框架
LUCENE.NET、HUBBLE.Net。这些个东西以后再整理。
3、反向索引,实现自己的搜索
虽然不是很相信这个这么简单的方案会带来多好的性能,但是觉得作为学习,反向索引这个东西还是有必要学习一下。But Not Now!