图片 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对那么些字段做了索引来优化找寻卡塔 尔(阿拉伯语:قطر‎,并且完成了更加高水平的查找,因为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的特色: 
          ·不剔除50%以上切合的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之间是空格,空格表示OKuga。即:再次来到记录起码含有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 QUE哈弗Y 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景逸SUVIABLES 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不扶植普通话全文索引,原因很简短:与泰语分歧,粤语的文字是连着一只写的,中间未有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数据库寻找分界面包车型客车时候,您能够品味那风度翩翩办法。

发表评论