图片 17

搜索之简单应用,MySQL中文全文检索

在给一个表加多字段的时候,猛然开掘会报叁个date类型的字段的暗中同意值错误,烦懑~

怎么在MySQL中得到更加好的全文字笔迹核查索结果  
作者: Techrepublic.com.com 
2006-04-03 11:14:53 

一、概述
     
MySQL全文检索是采纳查询关键字和查询列内容之间的相关度实行寻觅,能够使用全文索引来进步相称的快慢。

通过排查,原本是MySQL的配置难题,在wamp下,MySQL
5.7里是平昔不安装 SQL_MODE 的。

重重互连网应用程序都提供了全文字笔迹核查索成效,顾客能够行使三个词只怕词语片断作为查询项目来恒定匹配的记录。在后台,这个程序选择在一个SELECT查询中的LIKE语句来履行这种查询,就算这种艺术使得,但对此全文字笔迹核准索来讲,那是后生可畏种效能极端低下的措施,尤其在拍卖大量数据的时候。

二、语法
      MATCH (col1,col2,…) AGAINST (expr [search_modifier])
      search_modifier: { IN BOOLEAN MODE | WITH QUERY EXPANSION }
      
      例如:SELECT * FROM tab_name WHERE MATCH (‘列名1,列名2…列名n’)
AGAINST(‘词1 词2 词3 … 词m’);
    
      即:MATCH 约等于要协作的列,而 AGAINST 便是要找的源委。  
      这里的table需假使MyISAM类型的表,col1、col2
必得是char、varchar或text类型,在询问从前须求在 col1 和 col2
上分别创建全文索引(FULLTEXT索引)。

1.my.ini文件中找到 [mysqld]

MySQL针对那后生可畏主题素材提供了生龙活虎种基于内建的全文字笔迹查验索方法的消除方案。在这里,开辟者只要求轻易地方统一规范记出必要全文字笔迹查证索的字段,然后使用极度的MySQL方法在这里叁个字段运营寻找,那不止进步了质量和频率(因为MySQL对那个字段做了索引来优化寻觅卡塔 尔(英语:State of Qatar),而且落到实处了越来越高素质的追寻,因为MySQL使用自然语言来智能地对结果评级,以去掉不相干的品种。

三、检索方式
     1、自然语言检索: IN NATURAL LANGUAGE MODE

2.即便未有SQL_MODE,就拉长,有就改进一下

那篇小说将向你陈说在MySQL中什么实行全文字笔迹查验索。

     2、布尔检索: IN BOOLEAN MODE
         
剔除八分之四相称行以上皆有的词,譬喻说,每个行都有this这一个字的话,那用this去查时,会找不到其余结果,那在记录条数非常多时很有用,
         
原因是数据库以为把具有行都找寻来是未曾意思的,那时,this大约被作为是stopword(中断词);但是若只有两行记录时,是甚鬼也查不出去的,
          因为种种字都冒出百分之五十(或以上卡塔尔国,要防止这种光景,请用IN BOOLEAN
MODE。

sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

1、设置基本表格

       ● IN BOOLEAN MODE的特色: 
          ·不剔除百分之三十之上符合的row。 
          ·不自动以相关性反向排序。 
          ·能够对还没有FULLTEXT index的字段实行搜索,但会拾分慢。 
          ·限定最长与最短的字符串。 
          ·套用Stopwords。
 
       ● 寻觅语准则则:
         +   必要求有(不含有该重大词的数据条均被忽视)。 
         –   不可能有(清除钦点关键词,含有该重大词的均被忽略)。 
         >   进步该条相称数据的权重值。 
         <   降低该条相配数据的权重值。
         ~   将其相关性由正转负,表示具有该字会骤降相关性(但不像 –
将之扫除),只是排在较前边权重值收缩。 
         *   万用字,不像其余语法放在前方,这几个要接在字符串前边。 
         ” ” 用双引号将意气风发段句子包起来表示要完全合乎,不可拆字。

3.重启MySQL;

从创设例子表格发轫,使用以下的SQL命令:

         SELECT * FROM articles WHERE MATCH (title,content) AGAINST
(‘+apple -banana’ IN BOOLEAN MODE);
         + 表示AND,即必需带有。-
表示NOT,即必需不带有。即:再次回到记录须求包罗 apple,且不可能包括 banner。

mysql> CREATE TABLE reviews (id INT(5) PRIMARY KEY NOT NULL AUTO_INCREMENT, data TEXT);

         SELECT * FROM articles WHERE MATCH (title,content) AGAINST
(‘apple banana’ IN BOOLEAN MODE);
        
apple和banana之间是空格,空格表示OGL450。即:重临记录最少含有apple、banana中的八个。

以上命令创造了二个大约的音乐专融资料库(主要是整段的文字卡塔尔国,然后向那些表格中增添一些记下:

         SELECT * FROM articles WHERE MATCH (title,content) AGAINST
(‘+apple banana’ IN BOOLEAN MODE);
        
再次来到记录必须包蕴apple,同一时候banana可含蓄也可不含有,若包括的话会博得更加高的权重。

mysql> INSERT INTO `reviews` (`id`, `data`) VALUES

         SELECT * FROM articles WHERE MATCH (title,content) AGAINST
(‘+apple ~banana’ IN BOOLEAN MODE);
         ~
是大家耳濡目染的异或运算符。再次回到记录必得包括apple,若也满含了banana会收缩权重。
         可是它并未有 +apple -banana
严峻,因为前面一个要是带有banana压根就不回去。

(1, ‘Gingerboy has a new single out called Throwing Rocks. It’s great!’);

         SELECT * FROM articles WHERE MATCH (title,content) AGAINST
(‘+apple +(>banana <orange)’ IN BOOLEAN MODE);
         重临必需同有的时候候含有“apple banana”可能必需同期包涵“apple
orange”的笔录。
         若同不经常候包罗“apple banana”和“apple orange”的笔录,则“apple
banana”的权重高于“apple orange”的权重。

mysql> INSERT INTO `reviews` (`id`, `data`) VALUES 

    3、查询扩张检索: WITH QUEPRADOY EXPANSION

(2, ‘Hello all, I really like the new Madonna single. 

四、MySQL全文字笔迹查证索的尺码约束
    
1、在MySQL5.6以下,唯有MyISAM表扶助全文字笔迹查证索。在MySQL5.6以上Innodb引擎表也提供援助全文字笔迹核算索。
     2、相应字段建设构造FULLTEXT索引

One of the hottest tracks currently playing…I’ve been listening to it all day’);

五、与全文字笔迹考验索相关的连串变量:
     ft_min_word_len = 全文字笔迹核算索的最小许可字符(暗中同意4,通过 SHOW
VA路虎极光IABLES LIKE ‘ft_min_word_len’ 可查看),
     中文平时是多少个字正是三个词,所以做粤语的话须求改善这么些值为2最佳。

mysql> INSERT INTO `reviews` (`id`, `data`)

六、计算事项
     1、预设搜寻是不分大小写,若要分抑扬顿挫写,columne 的 character
set要从utf8改成utf8_bin。

VALUES (3, ‘Have you heard the new band Hotter Than Hell?

     2、预设 MATCH…AGAINST 是以相关性排序,由高到低。

They have five members and they burn their instruments when they play in concerts. 

     3、MATCH(title, content)里的字段必得和FULLTEXT(title,
content)里的字段一模二样。
          即使假定单查title或content三个字段,这得其它再建贰个FULLTEXT(title) 或
FULLTEXT(content),也因为如此,MATCH()的字段绝对不可以跨table,不过此外三种检索形式左近能够。
    
    
4、MySQL不援救中文全文索引,原因十分轻巧:与斯洛伐克共和国(The Slovak Republic卡塔 尔(英语:State of Qatar)语不相同,中文的文字是连着协同写的,中间没有MySQL能找到分词的地点,结束近来MySQL5.6版本是如此,可是有浮动的艺术,正是将整句的中文分词,并按urlencode、区位码、base64、拼音等张开编码使之以“字母+数字”的情势存储于数据库中。

These guys totally rock! Like, awesome, dude!’);

七、实验部分

申明数据的准确性录入:

◆ 步骤1 配置my.ini,在my.ini末尾加多如下:

mysql> SELECT * FROM reviews;

# 校正全文字笔迹核实索的最小许可字符为2个字符或汉字
ft_min_word_len = 2

+—-+——————————————–+

完成后“重启 MySQL 服务”,并用 SHOW VARIABLES LIKE ‘ft_min_word_len’
查询下是不是拿到了精确的结果值为2,如下图:
图片 1

| id | data                                       |

◆ 步骤2 创设数据库(视情状可跳过此步卡塔尔
CREATE DATABASE search DEFAULT CHARACTER SET utf8 COLLATE
utf8_general_ci;

+—-+——————————————–+

◆ 步骤3 创造数据表
CREATE TABLE `zzx_articles` (
`id` int(10) unsigned NOT NULL auto_increment, 
`title` char(254) default NULL COMMENT ‘标题’,
`content` text COMMENT ‘内容’,
`author` char(60) default NULL COMMENT ‘作者’,
`title_fc` char(254) default NULL COMMENT ‘题目标分词’,
`content_fc` text COMMENT ‘内容的分词’,
PRIMARY KEY  (`id`),
FULLTEXT KEY `zzx_title_fc` (`title_fc`),
FULLTEXT KEY `zzx_content_fc` (`content_fc`),
FULLTEXT KEY `zzx_title_con_fc` (`title_fc`,`content_fc`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

|  1 | Gingerboy has a new single out called …  |

# 假如中期需求添全文加索引能够用如下语句:
alter table `zzx_articles` add fulltext
zzx_title_fc(`title_fc`); 
alter table `zzx_articles` add fulltext
zzx_con_fc(`content_fc`); 
alter table `zzx_articles` add fulltext
zzx_title_con_fc(`title_fc`,`content_fc`);

|  2 | Hello all, I really like the new Madon … |

◆ 步骤4 插入测量试验数据
INSERT INTO `zzx_articles` (title_fc,content_fc) VALUES
(‘MySQL Tutorial Linux red’,’DBMS stands for DataBase ok’),
(‘How To Use MySQL Well’,’After you went through blue’),
(‘Optimizing MySQL ok’,’In this tutorial we will optimizing’),
(‘MySQL vs this YourSQL blue red’,’1. Never run mysqld as root red’),
(‘MySQL Tricks blue’,’In the following database’),
(‘MySQL Security’,’When configured properly, MySQL’),
(‘中华’,’中国 ‘),
(‘中华情 和谐’,’上海 和谐’),
(‘污染之都’,’你好 作者是 法国首都 人’),
(‘法国巴黎精气神’,’更正 爱国 宽容 厚颜’)

|  3 | Have you heard the new band Hotter Than… |

插入结果如下图:
图片 2

+—-+——————————————–+

◆ 步骤5 搜索语准绳则、排序 实验
   表达:般配语句 MATCH (col1,col2,…) AGAINST (expr
[search_modifier]) 相配成功后,会回到此条数据的权重值(权重值1 ≈
各类词的相配结果权重值之和),我们使用此权重值“由高到低”排序可优化查询结果。

3 rows in set (0.00 sec)

  

   ▶ 实验1:只对 title_fc 索引字段做全文字笔迹核查索,并出示每条数据的权重值

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red blue’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok red blue’ IN BOOLEAN
MODE) order by title_score DESC

   图片 3

   总计:1.当并未加 + –
那样的过滤符号时,那一个根本词是“或(or)”的涉嫌,即:要么相称optimizing,要么相配ok,要么相配red,要么相称blue。
           2.通过上边实验,开掘当某条数占有多个根本词相配时(如:red
blue),此条数据的权重值会略高:
              此条数据权重值 ≈ optimizing权重值 + ok权重值 + red权重值 +
blue权重值
             
理论上的话,当一条数据能相配上的第黄金时代词越来越多,则此条数据的权重值越高,排名越靠前。

2、定义全文字笔迹考验索字段

  

   ▶ 实验2:过滤条件:必得富含”red”关键词

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok +red’ IN BOOLEAN
MODE) order by title_score DESC

   图片 4

   总括:使用了过滤符号 +
,表示查询结果中,任一条数据都不得不包罗”red”那个词,不分包”red”那个词的行均被忽略。

接下去,定义您要作为全文寻找索引的字段

  

   ▶
实验3:过滤条件:必须包蕴”red”关键词,借使相配到的行中还蕴藏”blue”关键词,则会对此条数据扩张权重:

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red blue’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok +red blue’ IN BOOLEAN
MODE) order by title_score DESC

   或下边写法:
   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red >blue’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok +red >blue’ IN
BOOLEAN MODE) order by title_score DESC

   图片 5

  
计算:与试验2相比,当满含了red的行中,若也蕴藏blue关键词,权重确实增加了(如:id=4那条)。

mysql> ALTER TABLE reviews ADD FULLTEXT INDEX (data);

  

   ▶ 实验4:过滤条件:必需含有”red”关键词,何况不可能包括”blue”关键词

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red blue’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok +red -blue’ IN
BOOLEAN MODE) order by title_score DESC

   图片 6

   总括:可知 + –
那三个标识是意味“並且(and)”的乐趣,即:必得满含red关键词 and
无法满含blue关键词。

Query OK, 3 rows affected (0.21 sec)

  

   
   ▶
实验5:过滤条件:必需带有”red”关键词,假诺相称到的行中还包蕴”blue”关键词则下滑此条数据权重

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok +red ~blue’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok +red ~blue’ IN
BOOLEAN MODE) order by title_score DESC

   图片 7

   计算:这些试验未有看到明明效果与利益,但 ~ 过滤符确实是裁减此权重符

Records: 3  Duplicates: 0  Warnings: 0

  

   ▶ 实验6:过滤条件:匹配蕴含单词“red”和“Linux” 的行,或含有“red”
和“blue”的行(无前后相继顺序)
                可是含有 “apple Linux”的行较包涵“apple
blue”的行有更加高的权重值。

   SELECT *,MATCH (title_fc) AGAINST (‘+red  +(>Linux <blue)’)
as title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘+red  +(>Linux <blue)’ IN
BOOLEAN MODE) order by title_score DESC

   图片 8

  
—————————————————————————————————————————— 

   ▶ 实验7:过滤条件:相配关键词以 re 起头,或以 bl 起先的数据行

   SELECT *,MATCH (title_fc) AGAINST (‘re* bl*’) as title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘re* bl*’ IN BOOLEAN MODE) order
by title_score DESC

   图片 9

   总结:注意 * 是写在后头哦,当时也就是 like 模糊相称,未有权重值了

  
—————————————————————————————————————————— 

   ▶ 实验8:过滤条件:相配查找字符串“To Use MySQL”关键词

   SELECT *,MATCH (title_fc) AGAINST (‘”To Use MySQL”‘) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘”To Use MySQL”‘ IN BOOLEAN MODE)
order by title_score DESC

   图片 10

   总计:那时候是把双引号内的的字符串看成三个注重词,若不用双引号则是将 To
Use MySQL 八个至关心爱抚要词去分别相称,两个有分别;

应用SHOW INDEXES命令来检查索引已经被加多了:

  

   ▶ 实验9:在尝试1功底上,将blue的权重值忽略不要(注意与尝试1比较)

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok red blue’ IN BOOLEAN
MODE) order by title_score DESC

   图片 11

  
总括:在推行1的根基上,那时去除select字段条件里的blue关键词,但在where里去仍保留blue关键词。
            作者的本心是想健康匹配“optimizing ok red
blue”这么些至关心爱慕要词,但不想赢得blue的权重值(忽略blue的权重值)。
            查询的结果是含有blue关键词的多寡的权重值会略下跌了。
           
通过“降重”——忽视有个别重大词权重值的措施可使部分数据权重值减小,进而影响排序。

mysql> SHOW INDEXES FROM reviews;

  

   ▶
实验10:在实验9的底工上,在select字段条件里增添多少个red关键词,where里的机要词保持不改变(注意与尝试1
实验9比较)。

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red red red’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok red blue’ IN BOOLEAN
MODE) order by title_score DESC

   图片 12

   总计:开采只要含有 red
关键词的数指标权重值都增加了,排序也产生了变动。
          
表明经过“提重”——重复多次或多或少主要词权重值的点子可使部分数据权重值扩充,进而影响排序。

+———+—————+——–+——+————+———+

  

   ▶ 实验11:同时对 title_fc 和 content_fc 两字段做全文字笔迹查验索

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red blue’) as
title_score,MATCH (content_fc) AGAINST (‘optimizing ok red blue’) as
content_score
   FROM zzx_articles 
   WHERE MATCH (title_fc,content_fc) AGAINST (‘optimizing ok red blue’
IN BOOLEAN MODE) order by title_score DESC,content_score DESC

   图片 13

   总计:通过试验开掘,又成功的取到了 content_fc
字段相称的权重值,排序格局是重要按title字段权重降序排序,次要按
content_fc 权重降序排序。
           其它我意识 ok 这几个重要词在对“title_fc
char(254)”字段相配时获得相配值为2.1xxxxxxx,但对“content_fc
text”字段匹配时权重值去为0,
          
那是MySQL对各立陶宛语单词权重值的授予有谈得来的算法,我们无权干涉。所以当大家发掘成点单词的权重值为零竟然为负时,不用过于纠缠,
           因为MySQL有温馨的算法。

           关于排序,首要按 title_score 字段权重降序排序,次要按
content_score
权重降序排序,那样的排序法则看起来更不易了,但小编想好好的搜寻引擎绝不至于轻松如此吗,继续上面包车型地铁尝试:

| Table   | Column_name   | Packed | Null | Index_type | Comment |

  

   ▶ 实验12:进一层优化 排序准绳

      
看贰个SQL语句原型,查询“字段1,字段2”两字段,同一时候将每条数据的“字段1”与“字段2”的求和当做“字段3”字段:
       select 字段1,字段2,字段1 + 字段2 as 字段3
       from 表名
       where …..

   下面将 title_fc 和 content_fc 两权重值求和,放入新字段 score第11中学,并按 score1 首要排序,title_score 次之,content_score再次之:

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red blue’) as
title_score,MATCH (content_fc) AGAINST (‘optimizing ok red blue’) as
content_score,MATCH (title_fc) AGAINST (‘optimizing ok red blue’) +
MATCH (content_fc) AGAINST (‘optimizing ok red blue’) as score1
   FROM zzx_articles 
   WHERE MATCH (title_fc,content_fc) AGAINST (‘optimizing ok red blue’
IN BOOLEAN MODE) order by score1 DESC,title_score DESC,content_score
DESC

图片 14

   总计:相对来说,借使 title_fc 和 content_fc
都合作上了,应予以靠前的排行呢。所以最首要按其 title_fc 和 content_fc
两权重值之和排名,
            次要再思虑 title_fc、content_fc 排序。

———-+—————+——–+——+————+———+

  

   ▶ 实验13:另多少个角度看排序
     看一个SQL语句原型,借使性别字段值为“1”展现“男”不然展现“女”
     select *,IF(sex=1,”男”,”女”) as ssva from 表名 where id = 1

     作者的新排序思路:固然 title_fc 和 content_fc
同期协作上的行做重要排序,然后对只相配上 title_fc
的做扶植排序,只相称上 content_fc 的再次要排序。
(对于实验5的排序不正确之处在于:借使有一个对content_fc关键词的相配权重超级高,诱致了求和后
score1
的值也高,但对title_fc的相称权重去为0,由于score1值高却排到了前头这不一定科学吗?)

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red blue’) as
title_score,MATCH (content_fc) AGAINST (‘optimizing ok red blue’) as
content_score,IF(MATCH (title_fc) AGAINST (‘optimizing ok red blue’)
> 0 AND MATCH (content_fc) AGAINST (‘optimizing ok red blue’) >
0,1,0) as score1
   FROM zzx_articles 
   WHERE MATCH (title_fc,content_fc) AGAINST (‘optimizing ok red blue’
IN BOOLEAN MODE) order by score1 DESC,title_score DESC,content_score
DESC

图片 15

   总结:如果 title_fc 和 content_fc
都协作上了,做为优先排序理当如此,但也应思谋局地权重值过高的难点哦。

| reviews |  id           | NULL   |      | BTREE      |         |

  

    ▶ 实验14:优化实验13,可支撑更目不暇接的尺度排序
       看叁个SQL语句原型,CASE WHEN THEN END 结构:

          CASE <单值表明式>
              WHEN <表明式值> THEN <SQL语句只怕重临值>
              WHEN <表明式值> THEN <SQL语句或然重返值>
               …
              WHEN <表明式值> THEN <SQL语句大概重回值>
              ELSE <SQL语句或许再次来到值>
          END

      
有一表查询:大于或等于80意味显示为“卓越”,大于或等于60显得为“及格”,小于60分显示为“比不上格”。
       select (CASE WHEN 语文>=80 THEN ‘优秀’ WHEN 语文>=60 THEN
‘及格’ ELSE ‘不及格’ END) as 语文,
              (CASE WHEN 数学>=80 THEN ‘优秀’ WHEN 数学>=60 THEN
‘及格’ ELSE ‘不及格’ END) as 数学,
              (CASE WHEN 英语>=80 THEN ‘优秀’ WHEN 英语>=60 THEN
‘及格’ ELSE ‘不及格’ END) as 英语
       from table_name

       # 实例测量试验一下
       select *,(CASE WHEN id<8 THEN ‘5’ WHEN id=8 THEN ‘4’ ELSE ‘0’
END) as newfield
       from zzx_articles
       where id>5

       小编的新排序思路:假若 title_fc 和 content_fc
的权重值“同时大于0且相等”为首要排序,“同一时候大于0且不对等”的为协助排序,
       “title_fc 大于0的重新要排序”,若是用 IF()
貌似不佳达成,看上边语句:

       SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red blue’) as
title_score,MATCH (content_fc) AGAINST (‘optimizing ok red blue’) as
content_score,
             (CASE WHEN MATCH (title_fc) AGAINST (‘optimizing ok red
blue’) > 0 AND MATCH (title_fc) AGAINST (‘optimizing ok red blue’) =
MATCH (content_fc) AGAINST (‘optimizing ok red blue’) THEN ‘3’ WHEN
MATCH (title_fc) AGAINST (‘optimizing ok red blue’) > 0 AND MATCH
(title_fc) AGAINST (‘optimizing ok red blue’) <> MATCH
(content_fc) AGAINST (‘optimizing ok red blue’) THEN ‘2’ WHEN MATCH
(title_fc) AGAINST (‘optimizing ok red blue’) > 0 THEN ‘1’ ELSE ‘0’
END) AS score1
       FROM zzx_articles 
       WHERE MATCH (title_fc,content_fc) AGAINST (‘optimizing ok red
blue’ IN BOOLEAN MODE) order by score1 DESC,title_score
DESC,content_score DESC

图片 16

      
计算:本实验的排序未必切合科学,但引出三个更头眼昏花法则的排序格局、角度,多样排序结合使用技能做出更合理的排序,技巧使您的追寻引擎越发智能。进行试探,恐怕你有更加好的排序,请也分享给小编。

| reviews |  data         | NULL   | YES  | FULLTEXT   |         |

  

    ▶ 实验15:普通话全文字笔迹查证索
     
MySQL不支持中文全文字笔迹核算索,因为汉语一句话是连着写的,不像韩文单词间有空格分隔。解决办法正是普通话分词(关于粤语分词请参阅此外文章),
     
假若你的MySQL是设置在Windows平台上的,能够不用转码直接存款和储蓄普通话就能够利用全文索引,如本例。不过若是您的MySQL是设置在Linux上的则需求开展转编码(urlencode
/ base64_encode / json_encode / 区位 /
拼音)等方案,具体方案参看其余博文。

      SELECT *,MATCH (title_fc) AGAINST (‘中华 北京 和谐 security’) as
title_score,MATCH (content_fc) AGAINST (‘中华 北京 和谐 security’) as
content_score,(case when MATCH (title_fc) AGAINST (‘中华 北京 和谐
security’) > 0 and MATCH (content_fc) AGAINST (‘中华 北京 和谐
security’) > 0 then ‘5’ when MATCH (title_fc) AGAINST (‘中华 北京
和谐 security’) > 0 and MATCH (content_fc) AGAINST (‘中华 北京 和谐
security’) = 0 then ‘4’ else ‘0’ end) as score1
      FROM zzx_articles 
      WHERE MATCH (title_fc,content_fc) AGAINST (‘中华 北京 和谐
security’ IN BOOLEAN MODE) order by score1 DESC,title_score
DESC,content_score DESC

图片 17

 

来源:

+———+—————+——–+——+————+———+

2 rows in set (0.01 sec)

3、运行全文检索

当您具备了数据和目录,就能够使用MySQL的全文字笔迹核算索了,最简便的全文字笔迹查证索方式是带有MATCH…AGAINST语句的SELECT查询,以下是一个简短的事例,能够来查找含有单词“single”的记录:

mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST (‘single’);+—-+

| id |

+—-+

|  1 |

|  2 |

+—-+

2 rows in set (0.00 sec)

在这里,MATCH()将用作参数字传送递给它的字段中的文字与传递给AGAINST()的参数实行相比,假设有特别的,那就依照正规的方法赶回。注意你能够传递不仅仅八个字段用MATCH()来查阅­-只需用逗号来划分字段列表。

当MySQL收到了三个全文检索的伏乞,它就在内部对种种记录进行业评比分,不宽容的笔录得分为零,而“更相关”的记录会得到比“不太相关”的笔录相对更加高的分数。相关性是由MySQL的大器晚成多级区分标准来决定的,查看MySQL的顾客手册能够博得越来越多的音信。

想见到各样记录的评分怎么样,只供给重回MATCH()方法作为结果集的豆蔻梢头部分,如下所示:

mysql> SELECT id, MATCH (data) AGAINST (‘rock’) FROM reviews;

+—-+——————————-+

| id | MATCH (data) AGAINST (‘rock’) |

+—-+——————————-+

|  1 |                             0 |

|  2 |                             0 |

|  3 |               1.3862514533815 |

+—-+——————————-+

3 rows in set (0.00 sec)

4、使用逻辑搜索修饰符(Boolean search modifiers卡塔 尔(阿拉伯语:قطر‎

您还足以接收逻辑找寻修饰符来扩充订正确的搜索,那通过在AGAINST语句中增多特别的IN BOOLEAN MODE修饰符来达成,在以下的例证中,将寻觅含有单词“single”然则并没有“Madonna”的笔录:

mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST (‘+single -madonna’ IN BOOLEAN MODE);

+—-+

| id |

+—-+

|  1 |

+—-+

1 row in set (0.00 sec)

那大器晚成找寻天性平常用于搜索单词片断(实际不是完好的词语卡塔 尔(阿拉伯语:قطر‎,那能够透过在IN BOOLEAN MODE语句中的*(星号卡塔尔国操作符来贯彻,以下的例证显示了怎么找出单词中蕴藏“hot”的笔录:

mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST (‘hot*’ IN BOOLEAN MODE);+—-+

| id |

+—-+

|  3 |

|  2 |

+—-+

2 rows in set (0.00 sec)

您还足以选用这种方式来搜求起码多少个传递到AGAINST的参数中,以下的事例查找了最少含有单词“hell”和“rocks”中的二个的记录:

mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST (‘hell rocks’ IN BOOLEAN MODE);

+—-+

| id |

+—-+

|  1 |

|  3 |

+—-+

2 rows in set (0.00 sec)

以上的这么些事例演示了针锋相投于古板的SELECT…LIKE语句,举办全文检索的更平价的议程,当您下二次索要编写制定MySQL数据库寻找分界面包车型客车时候,您能够尝尝那生机勃勃办法。

发表评论

电子邮件地址不会被公开。 必填项已用*标注