`
hudeyong926
  • 浏览: 2033035 次
  • 来自: 武汉
社区版块
存档分类
最新评论

like 和 contains 和match() against()

阅读更多

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、中华   华人   人民   民共   共和   和国

 

 

分享到:
评论

相关推荐

    mysql全文模糊搜索MATCH AGAINST方法示例

    MySQL全文模糊搜索MATCH AGAINST方法是数据库管理员在处理大量文本数据时进行高效查询的重要工具,尤其是在需要进行复杂搜索条件匹配时。此方法适用于MySQL 4.x及以上版本,并且要求建立全文索引的表的存储引擎为...

    解决MySql大数据Like查询慢的问题

    3. **使用SOUNDEX或MATCH...AGAINST**:SOUNDEX是一种英文单词的音近字匹配函数,MATCH...AGAINST则是全文搜索的一部分,它们可以帮助优化模糊匹配,尤其是在处理自然语言数据时。 4. **前缀索引**:如果总是对某个...

    Crystal Impact Match!2.1.3 试用延长

    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 ...

    SQL语句 SELECT LIKE like用法详解SQL语句 SELECT LIKE like用法详解

    SQL中的SELECT LIKE语句是用来在字符型字段中进行模糊搜索的,这在处理大量文本数据时非常有用。LIKE关键字结合通配符可以帮助我们构建灵活的...通过熟练掌握LIKE语句和通配符的使用,我们可以更高效地查询和过滤数据。

    Sql Server参数化查询之where in和like实现详解

    Sql Server参数化查询之where in和like实现详解 在Sql Server中,参数化查询是提高查询性能和防止SQL注入攻击的有效方法之一。其中,where in和like是两个常用的查询条件,然而它们的参数化实现却不是那么简单。...

    like的用法PPT课件.pptx

    需要注意的是,like to do和like doing都表示”喜欢做某事“,但是它们的区别在于:like doing something表示经常性或习惯性地行为或动作,而like to do something则表示具体某一次的行为或动作。 最后,PPT课件还...

    Speak English Like An American完整版

    《Speak English Like An American》是一本非常实用的英语学习资源,旨在帮助学习者掌握美国人日常生活中常用的表达方式和词汇,从而提升口语能力。这个完整版包括了PDF教材和配套的音频文件,使得学习者可以结合...

    Quartz中的cron-like表达式解析 cron-like unix-like c#

    总的来说,Quartz的cron-like表达式解析是C#开发中实现定时任务的重要手段,它结合了Unix cron的便捷性和.NET的强大功能。通过深入理解这些表达式的结构和语法,开发者可以创建出高效且精确的定时任务解决方案。在...

    oracle like 的优化

    通过对Oracle LIKE操作符的深入理解和合理优化,可以显著提高数据库查询性能。特别是通过创建适当的索引和使用反向索引技术,能够在大多数情况下避免全表扫描,从而提升整体系统效率。希望本文介绍的方法能够帮助...

    sql的like用法

    通过以上介绍可以看出,Oracle数据库中的`LIKE`语句以及正则表达式提供了非常强大的文本匹配功能,这对于我们进行复杂的数据检索和处理非常有帮助。在实际应用中,根据具体的业务需求选择合适的匹配方法,可以大大...

    PostgreSQL Like模糊查询优化方案

    虽然标准的B树索引不适用于LIKE '%xxx%',但PostgreSQL 9.6及更高版本引入了布隆过滤器(Bloom Filters)和位图索引(Bitmap Indexes),在某些情况下可以辅助模糊查询。位图索引尤其适合在低基数(low-cardinality)...

    具有SubString搜索的自动完成文本框,类似于SQL Like或Contains

    首先,让我们了解SQL的Like命令和Contains方法。在SQL查询中,Like用于模糊匹配,通常与通配符%一起使用,例如`WHERE column LIKE '%pattern%'`,这将返回所有包含指定模式的行。而Contains方法是.NET框架中的字符串...

    sqlserver -like

    在SQL Server中,`LIKE`语句是...总结来说,`LIKE`语句结合`ESCAPE`关键字的使用,使得在SQL Server中进行复杂且精确的模式匹配成为可能,特别是在处理包含特殊字符的数据时,这种方法能够显著提高查询的准确性和效率。

    基于Django filter中用contains和icontains的区别(详解)

    以上这篇基于Django filter中用contains和icontains的区别(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:浅谈django mode

    haar-like特征提取

    例如,一个简单的haar-like特征可能是一个2x2的矩形,其中左上角和右下角的像素值之和减去右上角和左下角的像素值。当这个特征移动并应用于整个图像时,可以捕获图像中的亮度变化,从而反映出潜在的对象轮廓或特性。...

    SQL中like的用法

    SQL语句 SELECT LIKE like用法详解 包含你不知道的用法 在SQL结构化查询语言中,LIKE语句有着至关重要的作用。

    Speak English Like An American.pdf 电子书非扫描版

    《Speak English Like an American》是一本极具价值的英语学习资料,它不仅有助于提高英语口语能力,还能加深对美国文化和社交习惯的理解。无论是为了职业发展还是个人兴趣,这本书都能够成为学习者通向成功之路的...

    matlab ESPRIT-like算法

    ESPRIT-like算法是基于ESPRIT算法的解相干算法,通过构造托普利兹矩阵来进行解相干,使其可处理相干信号,此程序为一个函数,直接调用就行

Global site tag (gtag.js) - Google Analytics