首页 » 网站推广 » phpsqllike权重技巧_MySQL模糊查询再也用不着 like 了

phpsqllike权重技巧_MySQL模糊查询再也用不着 like 了

duote123 2024-12-09 0

扫一扫用手机浏览

文章目录 [+]

通过数值比较,范围过滤等就可以完成绝大多数我们须要的查询了。
但是,如果希望通过关键字的匹配来进行查询过滤,那么就须要基于相似度的查询,而不是原来的精确数值比较,全文索引便是为这种场景设计的。

全文索引(Full-Text Search)是将存储于数据库中的整本书或整篇文章中的任意信息查找出来的技能。
它可以根据须要得到全文中有关章、节、段、句、词等信息,也可以进行各种统计和剖析。

phpsqllike权重技巧_MySQL模糊查询再也用不着 like 了

在早期的 MySQL 中,InnoDB 并不支持全文检索技能,从 MySQL 5.6 开始,InnoDB 开始支持全文检索。

phpsqllike权重技巧_MySQL模糊查询再也用不着 like 了
(图片来自网络侵删)
倒排索引

全文检索常日利用倒排索引(inverted index)来实现,倒排索引通道 B+Tree 一样,也是一种索引构造。
它在赞助表中存储了单词与单词自身在一个或多个文档中所在位置之间的映射,这常日利用关联数组实现,拥有两种表现形式:

inverted file index:{单词,单词所在文档的id}full inverted index:{单词,(单词所在文档的id,在详细文档中的位置)}

上图为 inverted file index 关联数组,可以看到个中单词"code"存在于文档1,4中,这样存储再进行全文查询就大略了,可以直接根据 Documents 得到包含查询关键字的文档;而 full inverted index 存储的是对,即(DocumentId,Position),因此其存储的倒排索引如下图,如关键字"code"存在于文档1的第6个单词和文档4的第8个单词。

比较之下,full inverted index 占用了更多的空间,但是能更好的定位数据,并扩充一些其他搜索特性。

全文检索创建全文索引1、创建表时创建全文索引语法如下:

CREATE TABLE table_name ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, author VARCHAR(200), title VARCHAR(200), content TEXT(500), FULLTEXT full_index_name (col_name) ) ENGINE=InnoDB;

输入查询语句:

SELECT table_id, name, space from INFORMATION_SCHEMA.INNODB_TABLESWHERE name LIKE 'test/%';

上述六个索引表构成倒排索引,称为赞助索引表。
当传入的文档被标记化时,单个词与位置信息和关联的DOC_ID,根据单词的第一个字符的字符集排序权重,在六个索引表中对单词进行完备排序和分区。

2、在已创建的表上创建全文索引语法如下:

CREATE FULLTEXT INDEX full_index_name ON table_name(col_name);利用全文索引

MySQL 数据库支持全文检索的查询,全文索引只能在 InnoDB 或 MyISAM 地表面上利用,并且只能用于创建 char,varchar,text 类型的列。

其语法如下:

MATCH(col1,col2,...) AGAINST(expr[search_modifier])search_modifier:{ IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION}

全文搜索利用 MATCH() AGAINST()语法进行,个中,MATCH()采取逗号分隔的列表,命名要搜索的列。
AGAINST()吸收一个要搜索的字符串,以及一个要实行的搜索类型的可选润色符。
全文检索分为三种类型:自然措辞搜索、布尔搜索、查询扩展搜索,下面将对各种查询模式进行先容。

Natural Language

自然措辞搜索将搜索字符串阐明为自然人类措辞中的短语,MATCH()默认采取 Natural Language 模式,其表示查询带有指定关键字的文档。

接下来结合demo来更好的理解Natural Language

SELECT count() AS count FROM `fts_articles` WHERE MATCH ( title, body ) AGAINST ( 'MySQL' );

上述语句,查询 title,body 列中包含 'MySQL' 关键字的数量。
上述语句还可以这样写:

SELECT count(IF(MATCH ( title, body ) against ( 'MySQL' ), 1, NULL )) AS count FROM `fts_articles`;

上述两种语句虽然得到的结果是一样的,但从内部运行来看,第二句SQL的实行速率更快些,由于第一句SQL(基于where索引查询的办法)还须要进行干系性的排序统计,而第二种办法是不须要的。

还可以通过SQL语句查询干系性:

SELECT , MATCH ( title, body ) against ( 'MySQL' ) AS Relevance FROM fts_articles;

干系性的打算依据以下四个条件:

word 是否在文档中涌现word 在文档中涌现的次数多word 在索引列中的数量多少个文档包含该 word

对付 InnoDB 存储引擎的全文检索,还须要考虑以下的成分:

查询的 word 在 stopword 列表中,忽略该字符串的查询查询的 word 字符长度是否在区间 [innodb_ft_min_token_size,innodb_ft_max_token_size] 内

如果是在 stopword 中,则不对该词进行查询,如果对 'for' 这个时候进行查询,结果如下所示:

SELECT , MATCH ( title, body ) against ( 'for' ) AS Relevance FROM fts_articles;

可以看到,'for'虽然在文档 2,4中涌现,但由于其是 stopword ,故其干系性为0

参数 innodb_ft_min_token_size 和 innodb_ft_max_token_size 掌握 InnoDB 引擎查询字符的长度,当长度小于 innodb_ft_min_token_size 或者长度大于 innodb_ft_max_token_size 时,会忽略对该词的搜索。
在 InnoDB 引擎中,参数 innodb_ft_min_token_size 的默认值是3,innodb_ft_max_token_size的默认值是84

Boolean

布尔搜索利用分外查询措辞的规则来阐明搜索字符串,该字符串包含要搜索的词,它还可以包含指定哀求的运算符,例如匹配行中必须存在或不存在某个词,或者它的权重应高于或低于常日情形。

例如,下面的语句哀求查询有字符串"Pease"但没有"hot"的文档,个中+和-分别表示单词必须存在,或者一定不存在。

select from fts_test where MATCH(content) AGAINST('+Pease -hot' IN BOOLEAN MODE);

Boolean 全文检索支持的类型包括:

+:表示该 word 必须存在-:表示该 word 必须不存在(no operator)表示该 word 是可选的,但是如果涌现,其干系性会更高@distance表示查询的多个单词之间的间隔是否在 distance 之内,distance 的单位是字节,这种全文检索的查询也称为 Proximity Search,如 MATCH(context) AGAINST('"Pease hot"@30' IN BOOLEAN MODE)语句表示字符串 Pease 和 hot 之间的间隔需在30字节内>:表示涌现该单词时增加干系性<:表示涌现该单词时降落干系性~:表示许可涌现该单词,但涌现时干系性为负 :表示以该单词开头的单词,如 lik,表示可以是 lik,like,likes" :表示短语

下面是一些demo,看看 Boolean Mode 是如何利用的。

demo1:+ -

SELECT FROM `fts_articles` WHERE MATCH ( title, body ) AGAINST ( '+MySQL -YourSQL' IN BOOLEAN MODE );

上述语句,查询的是包含 'MySQL' 但不包含 'YourSQL' 的信息

demo2: no operator

SELECT FROM `fts_articles` WHERE MATCH ( title, body ) AGAINST ( 'MySQL IBM' IN BOOLEAN MODE );

上述语句,查询的 'MySQL IBM' 没有 '+','-'的标识,代表 word 是可选的,如果涌现,其干系性会更高

demo3:@

SELECT FROM `fts_articles` WHERE MATCH ( title, body ) AGAINST ( '"DB2 IBM"@3' IN BOOLEAN MODE );

上述语句,代表 "DB2" ,"IBM"两个词之间的间隔在3字节之内

demo4:> <

SELECT FROM `fts_articles` WHERE MATCH ( title, body ) AGAINST ( '+MySQL +(>database <DBMS)' IN BOOLEAN MODE );

上述语句,查询同时包含 'MySQL','database','DBMS' 的行信息,但不包含'DBMS'的行的干系性高于包含'DBMS'的行。

demo5: ~

SELECT FROM `fts_articles` WHERE MATCH ( title, body ) AGAINST ( 'MySQL ~database' IN BOOLEAN MODE );

上述语句,查询包含 'MySQL' 的行,但如果该行同时包含 'database',则降落干系性。

demo6:

SELECT FROM `fts_articles` WHERE MATCH ( title, body ) AGAINST ( 'My' IN BOOLEAN MODE );

上述语句,查询关键字中包含'My'的行信息。

demo7:"

SELECT FROM `fts_articles` WHERE MATCH ( title, body ) AGAINST ( '"MySQL Security"' IN BOOLEAN MODE );

上述语句,查询包含确切短语 'MySQL Security' 的行信息。

Query Expansion

查询扩展搜索是对自然措辞搜索的修正,这种查询常日在查询的关键词太短,用户须要 implied knowledge(隐含知识)时进行,例如,对付单词 database 的查询,用户可能希望查询的不仅仅是包含 database 的文档,可能还指那些包含 MySQL、Oracle、RDBMS 的单词,而这时可以利用 Query Expansion 模式来开启全文检索的 implied knowledge通过在查询语句中添加 WITH QUERY EXPANSION / IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION 可以开启 blind query expansion(又称为 automatic relevance feedback),该查询分为两个阶段。

第一阶段:根据搜索的单词进行全文索引查询第二阶段:根据第一阶段产生的分词再进行一次全文检索的查询

接着来看一个例子,看看 Query Expansion 是如何利用的。

-- 创建索引create FULLTEXT INDEX title_body_index on fts_articles(title,body);

-- 利用 Natural Language 模式查询SELECT FROM `fts_articles` WHERE MATCH(title,body) AGAINST('database');

利用 Query Expansion 前查询结果如下:

-- 当利用 Query Expansion 模式查询SELECT FROM `fts_articles` WHERE MATCH(title,body) AGAINST('database' WITH QUERY expansion);

利用 Query Expansion 后查询结果如下:

由于 Query Expansion 的全文检索可能带来许多非干系性的查询,因此在利用时,用户可能须要非常谨慎。

删除全文索引1、直接删除全文索引语法如下:

DROP INDEX full_idx_name ON db_name.table_name;2、利用 alter table 删除全文索引语法如下:

ALTER TABLE db_name.table_name DROP INDEX full_idx_name;

标签:

相关文章