- 浏览: 2021498 次
- 来自: 武汉
文章分类
- 全部博客 (415)
- UI设计 (19)
- PHP (26)
- PHP工具类 (23)
- 二次开发 (53)
- phpMVC (28)
- javascript (50)
- JS 组件 (20)
- MYSQL (37)
- 其他 (16)
- xml/flash/flex (6)
- 版本控制 (7)
- 开源 (4)
- bug解决 (5)
- Linux (15)
- NoSQL (14)
- 软件设计 (21)
- C/PHP内核 (5)
- 安全性 (8)
- 面试 (18)
- 设计模式 (4)
- 重构 (6)
- 开发配置 (11)
- SQL SERVER (12)
- 采集 (3)
- SEO (2)
- 维护 (15)
- UML (5)
- 硬件标准 (1)
- 架构 (8)
- JAVA (1)
最新评论
-
carry0987:
求大神分離下X3的模板...不然對於PHP7不友好啊...
分离自Discuz模板类和语法 -
青木得海角:
你好,里面的 Crypt/TripleDES.php 和 Cr ...
POS机算法 -
zohog:
楼主,Mac.php中里面的 Crypt/TripleDES. ...
POS机算法 -
zohog:
楼主,Mac.php中里面的 Crypt/TripleDES. ...
POS机算法 -
q59200182:
能不能给个完整的demo 新手上路不会 求带
AngularJs 指令directive之controller,link,compile
Like直接在数据据中查找可以查到所有所需记录但是会扫描整个表会影响性能,
CONTAINS是基于全文索引
进行查询,查询结果受系统全文索引分词的方法影响查询结果会不全。
Select * FROM A Where CONTAINS(B,'"IT"Or"理论"')5257条记录
Select * FROM A Where B Like'%IT%' or B LIKE '%理论%' 5468条记录
结论:需要精确查询用Like如产品搜索,内容搜索可以用CONTAINS提高效率。
全文索引——CONTAINS 语法
我们通常在 WHERE 子句中使用 CONTAINS ,就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents')。 php学习之家
我们通过例子来学习,假设有表 students,其中的 address 是全文本检索的列。
1. 查询住址在北京的学生
SELECT student_id,student_name FROM students WHERE CONTAINS( address, 'beijing' )
remark: beijing是一个单词,要用单引号括起来 。
2. 查询住址在河北省的学生
SELECT student_id,student_name FROM students WHERE CONTAINS( address, '"HEIBEI province"' )
remark: HEBEI province是一个词组,在单引号里还要用双引号括起来 。
3. 查询住址在河北省或北京的学生
SELECT student_id,student_name FROM students WHERE CONTAINS( address, '"HEIBEI province" OR beijing' )
remark: 可以指定逻辑操作符(包括 AND ,AND NOT,OR )。
4. 查询有 '南京路' 字样的地址
SELECT student_id,student_name FROM students WHERE CONTAINS( address, 'nanjing NEAR road' )
remark: 上面的查询将返回包含 'nanjing road','nanjing east road','nanjing west road' 等字样的地址。
A NEAR B,就表示条件: A 靠近 B。
5. 查询以 '湖' 开头的地址
SELECT student_id,student_name FROM students WHERE CONTAINS( address, '"hu*"' )
remark: 上面的查询将返回包含 'hubei','hunan' 等字样的地址。记住是 *,不是 %。 www.444p.com
6. 类似加权的查询
SELECT student_id,student_name FROM students WHERE CONTAINS( address, 'ISABOUT (city weight (.8), county wright (.4))')
remark: ISABOUT 是这种查询的关键字,weight 指定了一个介于 0~1之间的数,类似系数(我的理解)。表示不同条件有不同的侧重。
7. 单词的多态查询
SELECT student_id,student_name FROM students WHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' )
remark: 查询将返回包含 'street','streets'等字样的地址。
对于动词将返回它的不同的时态,如:dry,将返回 dry,dried,drying 等等。
以上例子都使用英文,不使用中文是因为有的查询方式中文不支持 。
MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])
MySQL支持全文索引和搜索功能。MySQL中的全文索引类型FULLTEXT的索引。 FULLTEXT 索引仅可用于 MyISAM
表;他们可以从CHAR、 VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或
CREATE INDEX被添加。对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,
其速度比把资料输入现有FULLTEXT索引的速度更为快。
mysql> CREATE TABLE articles ( -> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, -> title VARCHAR(200), -> body TEXT, -> FULLTEXT (title,body) -> ); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO articles (title,body) VALUES -> ('MySQL Tutorial','DBMS stands for DataBase ...'), -> ('How To Use MySQL Well','After you went through a ...'), -> ('Optimizing MySQL','In this tutorial we will show ...'), -> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), -> ('MySQL vs. YourSQL','In the following database comparison ...'), -> ('MySQL Security','When configured properly, MySQL ...'); Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' IN BOOLEAN MODE); +----+-------------------+------------------------------------------+ | id | title | body | +----+-------------------+------------------------------------------+ | 5 | MySQL vs. YourSQL | In the following database comparison ... | | 1 | MySQL Tutorial | DBMS stands for DataBase ... | +----+-------------------+------------------------------------------+ 2 rows in set (0.00 sec)
MATCH()函数对于一个字符串执行资料库内的自然语言搜索。一个资料库就是1套1个或2个包含在FULLTEXT内的列。搜索字符串作为对
AGAINST()的参数而被给定。对于表中的每一行, MATCH() 返回一个相关值,即, 搜索字符串和
MATCH()表中指定列中该行文字之间的一个相似性度量。
在默认状态下, 搜索的执行方式为不区分大小写方式。然而,你可以通过对编入索引的列使用二进制排序方式执行区分大小写的全文搜索。 例如,可以向一个使用latin1字符集的列给定latin1_bin 的排序方式,对于全文搜索区分大小写。
如上述所举例子,当MATCH()被用在一个 WHERE 语句中时,相关值是非负浮点数。零相关的意思是没有相似性。相关性的计算是基于该行中单词的数目, 该行中独特子的数目,资料库中单词的总数,以及包含特殊词的文件(行)数目。
对于自然语言全文搜索,要求MATCH() 函数中命名的列和你的表中一些FULLTEXT索引中包含的列相同。对于前述问讯,
注意,MATCH()函数(题目及全文)中所命名的列和文章淼腇ULLTEXT索引中的列相同。若要分别搜索题目和全文,应该对每个列创建
FULLTEXT索引。
上面的例子基本上展示了怎样使用返回行的相关性顺序渐弱的MATCH()函数。而下面的例子则展示了怎样明确地检索相关值。返回行的顺序是不定的,原因是 SELECT 语句不包含 WHERE或ORDER BY 子句:
mysql> SELECT id, MATCH (title,body) AGAINST ('Tutorial') -> FROM articles; +----+-----------------------------------------+ | id | MATCH (title,body) AGAINST ('Tutorial' IN BOOLEAN MODE) | +----+-----------------------------------------+ | 1 | 0.65545833110809 | | 2 | 0 | | 3 | 0.66266459226608 | | 4 | 0 | | 5 | 0 | | 6 | 0 | +----+-----------------------------------------+ 6 rows in set (0.00 sec)
下面的例子则更加复杂。询问返回相关值,同时对行按照相关性渐弱的顺序进行排序。为实现这个结果,你应该两次指定 MATCH(): 一次在 SELECT 列表中而另一次在 WHERE子句中。这不会引起额外的内务操作,原因是MySQL 优化程序注意到两个MATCH()调用是相同的,从而只会激活一次全文搜索代码。
mysql> SELECT id, body, MATCH (title,body) AGAINST -> ('Security implications of running MySQL as root') AS score -> FROM articles WHERE MATCH (title,body) AGAINST -> ('Security implications of running MySQL as root' IN BOOLEAN MODE); +----+-------------------------------------+-----------------+ | id | body | score | +----+-------------------------------------+-----------------+ | 4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 | | 6 | When configured properly, MySQL ... | 1.3114095926285 | +----+-------------------------------------+-----------------+ 2 rows in set (0.00 sec) 表中有2行(0.00 秒)
再为表添加 fulltext 上去
mysql> alter table articles add fulltext index(title,body);
MySQL FULLTEXT 执行将任何单字字符原形 (字母、数字和下划线部分)的序列视为一个单词。这个序列或许也包含单引号
('),但在一行中不会超过一个。 这意味着 aaa'bbb 会被视为一个单词,而
aaa''bbb则被视为2个单词。位于单词之前或其后的单引号会被FULLTEXT分析程序去掉; 'aaa'bbb' 会变成 aaa'bbb。
FULLTEXT分析程序会通过寻找某些分隔符来确定单词的起始位置和结束位置,例如' ' (间隔符号)、 , (逗号)以及 . (句号
)。假如单词没有被分隔符分开,(例如在中文里 ), 则 FULLTEXT
分析程序不能确定一个词的起始位置和结束位置。为了能够在这样的语言中向FULLTEXT
索引添加单词或其它编入索引的术语,你必须对它们进行预处理,使其被一些诸如"之类的任意分隔符分隔开。
一些词在全文搜索中会被忽略:
任何过于短的词都会被忽略。 全文搜索所能找到的词的默认最小长度为 4个字符。
停止字中的词会被忽略。禁用词就是一个像“the” 或“some” 这样过于平常而被认为是不具语义的词。存在一个内置的停止字, 但它可以通过用户自定义列表被改写。
词库和询问中每一个正确的单词根据其在词库和询问中的重要性而被衡量。
通过这种方式,一个出现在许多文件中的单词具有较低的重要性(而且甚至很多单词的重要性为零),原因是在这个特别词库中其语义价值较低。反之,假如这个单
词比较少见,那么它会得到一个较高的重要性。然后单词的重要性被组合,从而用来计算该行的相关性。
这项技术最适合同大型词库一起使用 (事实上, 此时它经过仔细的调整 )。对于很小的表,单词分布并不能充分反映它们的语义价值, 而这个模式有时可能会产生奇特的结果。例如, 虽然单词 “MySQL” 出现在文章表中的每一行,但对这个词的搜索可能得不到任何结果:
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL');
找不到搜索的词(0.00 秒)
这个搜索的结果为空,原因是单词 “MySQL” 出现在至少全文的50%的行中。 因此, 它被列入停止字。对于大型数据集,使用这个操作最合适不过了----一个自然语言问询不会从一个1GB 的表每隔一行返回一次。对于小型数据集,它的用处可能比较小。
一个符合表中所有行的内容的一半的单词查找相关文档的可能性较小。事实上,
它更容易找到很多不相关的内容。我们都知道,当我们在因特网上试图使用搜索引擎寻找资料的时候,这种情况发生的频率颇高。可以推论,包含该单词的行因其所
在特别数据集 而被赋予较低的语义价值。 一个给定的词有可能在一个数据集中拥有超过其50%的域值,而在另一个数据集却不然。
当你第一次尝试使用全文搜索以了解其工作过程时,这个50% 的域值提供重要的蕴涵操作:若你创建了一个表,并且只将文章的1、2行插入其中,
而文中的每个单词在所有行中出现的机率至少为 50% 。那么结果是你什么也不会搜索到。一定要插入至少3行,并且多多益善。需要绕过该50%
限制的用户可使用布尔搜索代码
全文索引效率确实高,但是也产生了很多不符合条件的记录。like则效率低下分词有多种方法
比如把 "中华人民共和国 "分词简单的就有如下两种:
1、中华 人民 共和国
2、中华 华人 人民 民共 共和 和国
发表评论
-
存储过程 循环创建多张表 和 多个数据库
2017-05-25 11:00 1497创建所有数据库 调用 ... -
mysql中的zerofill的应用
2014-06-24 09:10 1279整型字段有个ZEROFILL属性,在数字长度不够的数据前面 ... -
MySQL查询不区分大小写问题
2013-09-17 15:27 1477问题描述: 找出用户 ... -
MySQL大数据量分页查询方法及其优化
2013-07-16 13:39 1607分页的2种写法 SELECT keyword FRO ... -
MySQL定时器Events
2013-01-30 10:54 1553以下功能主要供学习 ... -
MYSQL FEDERATED存储引擎
2012-04-23 19:25 1819FEDERATED是其中一个专门针对远程数据库的实现。一般 ... -
MYSQL InnoDB表锁
2012-04-19 19:55 7453InnoDB锁问题InnoDB与MyISA ... -
MYSQL MyISAM表锁
2012-04-18 23:12 10394锁是计算机协调多个进程或线程并发访问某一资源的机制 。在数 ... -
MyISAM InnoDB 区别
2012-02-14 11:50 1472主要区别: 1).MyISAM ... -
MySQL索引
2012-01-13 09:58 14091、索引是什么 索引 ... -
MySQL binlog日志
2011-11-08 16:23 1719binlog日志记录对数据发生或潜在发生更改的SQL语句, ... -
mysql 复制表数据,表结构的方法
2011-11-08 15:33 1333什么时候我们会用到复制表?例如:我现在对一张表进行操作,但 ... -
mysql分区
2011-09-29 12:15 1545一,什么是数据库分区 前段时间写过一篇关于mysql分表的 ... -
mysql分表,分区的区别和联系
2011-09-29 12:09 1688一,什么是mysql分表, ... -
MySQL数据库下.frm .MYD .MYI损坏恢复操作
2011-06-23 10:56 2745将数据库内容物理文件直接导入到mysql\data下,每只表各 ... -
Linux下快速重置MySQL用户(root)密码方法
2011-05-24 11:03 2256skip-grant-tables顾名思义,数据库启动的时候 ... -
海量数据的删除策略
2011-03-28 10:54 16541.延迟删除一条数据会 ... -
使用CASE WHEN进行字符串替换处理
2011-03-01 16:21 3532/* mysql> select * from sa ... -
数据库字段设计经验谈
2011-01-30 14:14 1633数据库的设计必须符 ... -
mysql 自定义函数
2011-01-25 10:46 5968功能主要供学习。高并发场景不要使用mysql特性(触发器, ...
相关推荐
SQL语句 SELECT LIKE like用法详解SQL语句 SELECT LIKE like用法详解SQL语句 SELECT LIKE like用法详解
Additional knowledge about the sample like known phases, elements or density can be applied easily. In addition to this qualitative analysis, a quantitative analysis (using Rietveld refinement) can ...
需要注意的是,like to do和like doing都表示”喜欢做某事“,但是它们的区别在于:like doing something表示经常性或习惯性地行为或动作,而like to do something则表示具体某一次的行为或动作。 最后,PPT课件还...
基于扩展的Haar-Like特征和LBP特征的人脸压缩跟踪算法 在人脸识别和跟踪领域,压缩跟踪算法是一种常用的方法。但是,传统的压缩跟踪算法基于简单的Haar-Like特征,易于在遮挡、光照变化、物体形变及背景干扰等情况...
以上这篇基于Django filter中用contains和icontains的区别(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:浅谈django mode
SQL语句 SELECT LIKE like用法详解 包含你不知道的用法 在SQL结构化查询语言中,LIKE语句有着至关重要的作用。
Quartz中的cron-like表达式解析 cron-like unix-like c#
此文档中详细的记载了,Sql Server参数化查询之where in和like实现详解,希望可以帮到下载的朋友们!
More Speak English Like an American :Learn More Idioms & Expressions That Will Help You Speak Like a Native!
LikeView How to use 1、To include likeview to your project: add the dependency to the the build.gradle file compile 'com.jaren:likeview:1.2.1' 2、Create likeview : create default create with ...
MySql查询数据慢可以用用这个工具,瞬间提升Like查询效率
Speak English like an American MP3 完整版03(因上传限制,共3部分)
Speak English Like An American完整版,PDF文件+音频文件,一次下载解决所有问题
首先想到的就是contains,contains用法如下: select * from students where contains(address, 'beijing') 但是,使用contains谓词有...另外,还有个笨办法,那就是使用like,说到这里大家应该知道怎么做了吧: sel
Speak English Like An American.pdf 电子书非扫描版,可以复制里面的内容到放到MP3
sql server like用法 将通配符作为文字使用
ESPRIT-like算法是基于ESPRIT算法的解相干算法,通过构造托普利兹矩阵来进行解相干,使其可处理相干信号,此程序为一个函数,直接调用就行
Think Like a Programmer
具有SQL的Like命令方式的具有自动完成功能的TextBox
MySQL数据库查询中的like问题 MySQL 数据库查询中的like... MySQL 数据库查询中的like问题是由于 MySQL 数据库的设计特点和中文汉字的双字节字符引起的,可以通过使用binary关键字或指定字符集来避免多余数据的问题。