查询反模式 - 全文搜索

一、目标:全文搜索

  任何存储文本的应用都有针对这个文本进行单词或词组搜索的需求。我们使用数据库存储越来越多的文本数据,同时也需要搜索速度越来越快。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!

时间: 2024-11-10 13:11:44

查询反模式 - 全文搜索的相关文章

查询反模式 - 正视NULL值

一.提出问题 不可避免地,我们都数据库总有一些字段是没有值的.不管是插入一个不完整的行,还是有些列可以合法地拥有一些无效值.SQL 支持一个特殊的空值,就是NULL. 在很多时候,NULL值导致我们的程序出现报错的现象,于是很多人就开始拒绝NULL值,想各种各样的方法来避免使用NULL值,但是很遗憾,NULL值恰恰就是满足我们的需要用于表示空值的. 空值经常存在于我们的数据库当中: 例如一个在职员工的离职时间. 例如一辆电力驱动的车的燃油消耗比. 二.反模式 很多人对于NULL值感觉到恐惧,原因

查询反模式 - 隐式的列

一.减少输入 程序员都喜欢使用通配符,如: SELECT * FROM Person 又或者省略字段名: INSERT INTO Person VALUES('10','张飞'...) 二.捷径会让你迷失方向 对于以上代码,如果你仅仅是在开发过程中用于查看一下数据库信息,又或者你只是写个小程序自己玩玩,这是没有什么问题的. 但是如果一旦你习惯于这样编写正式生产环境中的代码,那问题就随之而来了. 1.破坏代码重构 如果数据库更改了,比如增加了一列: ALTER TABLE Person Add A

查询反模式 - 随机选择

一.问题提出 随机数在数据库中是经常用到的系统. 例如,一个广告系统希望随机选择一个广告来显示.随机推荐相关文章等等. 在SQL Server中查找随机数最简单的方法为: SELECT TOP 1 * FROM Person ORDER BY NEWID() 以上SQL语句的执行计划如下: 以上这种方法,需要对整个表进行一次排序,而且还无法有效地使用索引.加入我们只需要前几条数据,那么好不容易对整个结果集完成了排序,但绝大多数都浪费了. 以上的方式缺点如下: 随着数据量的增加,随机数的产生会变慢

查询反模式 - GroupBy、HAVING的理解

为了最简单地说明问题,我特地设计了一张这样的表. 一.GROUP BY单值规则 规则1:单值规则,跟在SELECT后面的列表,对于每个分组来说,必须返回且仅仅返回一个值. 典型的表现就是跟在SELECT后面的列,如果没有使用聚合函数,必须出现在GROUP BY子句后面. 如下面这个查询报错: 因为对于按照部门分组之后,技术部分组有3个编号,销售部分组有2个编号,你让数据库显示哪个呢? 如果假设你使用聚合函数COUNT(编号)之后,对于每个部门分组,就只有一个值 - 该部门下的人数: 下面来实战下

查询反模式 - GroupBy和HAVING的理解

为了最简单地说明问题,我特地设计了一张这样的表. 一.GROUP BY单值规则 规则1:单值规则,跟在SELECT后面的列表,对于每个分组来说,必须返回且仅仅返回一个值. 典型的表现就是跟在SELECT后面的列,如果没有使用聚合函数,必须出现在GROUP BY子句后面. 如下面这个查询报错: 因为对于按照部门分组之后,技术部分组有3个编号,销售部分组有2个编号,你让数据库显示哪个呢? 如果假设你使用聚合函数COUNT(编号)之后,对于每个部门分组,就只有一个值 - 该部门下的人数: 下面来实战下

SQL反模式学习笔记1 开篇

什么是“反模式” 反模式是一种试图解决问题的方法,但通常会同时引发别的问题. 反模式分类 (1)逻辑数据库设计反模式 在开始编码之前,需要决定数据库中存储什么信息以及最佳的数据组织方式和内在关联方式. 这包含了如何设计数据库的表.字段和关系. (2)物理数据库设计反模式 在确定了需要存储哪些数据之后,使用你所知的RDBMS关系型数据库技术特性尽可能高效地实现数据库管理. 这包含了定义表和索引,以及选择数据类型.也需要是要SQL的“数据定义语言”,比如Create Table语句. (3)查询反模

SQL反模式学习笔记17 全文搜索

2014-10-16 09:56:37 目标:全文搜索 使用SQL搜索关键字,同时保证快速和精确,依旧是相当地困难. SQL的一个基本原来(以及SQL所继承的关系原理)就是一列中的单个数据是原子性的. 反模式:模式匹配 使用Like 或者正则表达式. 缺点:(1)无法使用索引,进行全表遍历,非常耗时,性能极低. (2)有时候会返回医疗之外的结果.select * from bugs where description like '%one%', 返回结果可能是money.prone.lonely

[Elasticsearch] 全文搜索 (一) - 基础概念和match查询

全文搜索(Full Text Search) 现在我们已经讨论了搜索结构化数据的一些简单用例,是时候开始探索全文搜索了 - 如何在全文字段中搜索来找到最相关的文档. 对于全文搜索而言,最重要的两个方面是: 相关度(Relevance) 查询的结果按照它们对查询本身的相关度进行排序的能力,相关度可以通过TF/IDF,参见什么是相关度,地理位置的邻近程度(Proximity to a Geo-location),模糊相似性(Fuzzy Similarity)或者其它算法进行计算. 解析(Analys

第二天,导出文件sql,查询,视图view,聚合函数,反模式,字符串处理函数

//把数据库导出到脚本文件mysqldump -uroot -p1234 --databases abc > d:/a/abc.sql CREATE TABLE stud( id INT PRIMARY KEY, NAME VARCHAR(32) NOT NULL, score NUMERIC(4,1));//把所有名字都设成"Mike"了UPDATE stud SET NAME="Mike" //只设置分数>=70的记录的NameUPDATE stud