mysql在全文本搜索的函数中用于指定_MySQL ------ 全文本搜索( match和Against),以及查询扩展和 布尔方式(十七)...

检索单个列 note_text ,将字段note_text中含有rabbit的行检索出来

select note_text from productnotes where match(note_text) against(‘rabbit‘);

d415da762773677fdfcdaad6de918a57.png

select 语句检索单个列onte_text 由于where 子句,一个全文本搜索被执行,match(note_text) 指示mysql 针对列名为note_text 的进行搜索,against(‘rabbit‘) 指定在该列中搜索文本中含有 rabbit 的行,包含的行就返回

注意:

1、传递给match() 的值必须与fulltext() 定义中的相同,如果指定多个列,则必须列出他们,而且次序也要相同

2、全文本搜索不区分大小写,除非使用 binary 方式

使用 like 和 regexp 的方式实现

select note_text from productnotes where note_text like ‘%rabbit%‘;select note_text from productnotes where note_text regexp ‘rabbit‘;

e1a22cb8c370e46d8b5d96bd4296bfd9.png

发现这两种方式检索出来的两行,与使用全文本搜索检索出来的 顺序(次序)不同,而且都没有使用order by

为啥来

因为使用全文本搜索返回的数据,以文本匹配的良好程度排序匹配,虽然两行都有rabbit 这个词,但是一个位置在第3个词,另一个位置在第20个词,所以全文本搜索根据具有高等级的行先返回(这也可能是真正想要的)。而like 没有指定也不会以特别有用的顺序返回数据。

如何计算他们的程度的来

select note_text,match(note_text) against(‘rabbit‘) as rank from productnotes;

277c2f6a31d8fb1ccfccb230a458ddb7.png

match ()  和 against() 用来建立一个计算列(别名rank),将此列包含全文本搜索计算出等级值

等级计算方式:mysql  根据行中词的数目、唯一词的数目、整个索引中词的总数以及包含该词的行的数目计算出来。其中不含有的为 0 ,包含的都有一个等级值,等级值越高检索出来后的排列越靠前。如果指定多个搜索项,则包含多数匹配词的那些行将比包含较少词(或仅有一个匹配)的那些行等级高。

全文本搜索提供了like 不具有的功能,而且由于数据是索引的,全文本搜索还较快

2、查询扩展(WITH QUERY EXPANSION):用来设法放宽所返回的全文本搜索结果的范围。

就是首先将根据关键词全文本搜索找出来行,然后再根据返回出来的行,从中选择有用的词,在和关键词一块作为查询条件进行搜索。

查询扩展只适用于mysql 4.1.1 或更高级的版本

使用查询扩展时,mysql 对数据和索引进行两遍扫描来完成搜索,找出可能相关的结果,即使他们并不精确的包含所查找的词。

1、首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有行

2、然后,mysql 检查这些匹配行并选择所有有用的词(根据关键词检索出来的那个行从中选择有用的词)

3、最后,MySQL再次进行全文本搜索,这次不仅使用原来的条件,还要使用所有有用的词

--启用查询扩展 WITH QUERY EXPANSION

select note_text from productnotes where match(note_text) against(‘anvils‘ WITH QUERY EXPANSION);

288d0cdd241759a0e977012f20faf066.png

cfe46102e4b4fd32dd9aa481a48442dc.png

从上述可以看出,第一行有 anvils (铁砧),剩下的6行都没有,第二行根据 第一行中的两个有特点的词(customer(顾客)和 Recommend(推荐)),在进行查找,为啥选customer作为检索的词可能是在此行中出现的较多,还是个主语,了解就行

使用查询扩展检索出来的行更多,表中的行越多使用查询扩展返回的结果越好 ,因为更多的选择意味着更有机会把你快要忘记的那个找到。

3、布尔文本搜索(IN BOOLEAN MODE)

MySQL支持全文本搜索的另一种形式,布尔方式(boolean mode)

注意:

1、布尔方式即使没有定义fulltext 索引,也可以使用,但是它是一种非常缓慢的操作(其性能将随着数据i量的增加而降低)

2、要匹配的词

3、要排斥的词(如果某行包含这个词,则不返回,即使它包含其他指定的词)

4、排列提示(指定某些词比其他词更重要,更重要的词等级更高)

5、表达式分组

6、另外一些内容

--简单使用

select note_text from productnotes where match(note_text) against (‘heavy‘ in boolean mode);

a17c33f5e985022a4c2cc29b50728c13.png

另一种用法,指定排斥的词

--匹配包含 但不包含 任意以rope 开始的词的行

select note_text from productnotes where match(note_text) against (‘heavy -rope*‘ in boolean mode);

f211bd6cd65d209febda8c1a80abd95c.png

如果数据的的版本是 mysql 4.x 上面可能不反回任何行,其不支持 * ,要改为 -ropes 意思变成 并排除含有 ropes 的行

上述的 - 和 * 就是全文本布尔操作符

cfe6346149d9c8bdc7403f1230112ca4.png

小小使用

804a1bcdd3868e5e105458a083c1310b.png

注意:在布尔方式中不按照等级值降序排列返回行

全文本搜索的使用说明

1、在索引全文本数据时,短词被忽略且从索引中排除。短词定义为那些具有3个或3个以下字符的词(如果需要,这个数目可以改)

2、MySQL带有一个内建的非用词(stopword)列表,这些词在索引全文本数据时总是被忽略。如果需要,可以覆盖这个列表

3、许多词出现的频率很高,搜索他们没有用处(返回太多的结果),因此,MySQL规定了一条50%规则,如果一个词出现50%以上的行中。则将他作为一个非用词忽略。50%规则不用于 IN BOOLEAN MODE

4、如果表中的行数少于3行,则全文本搜索不返回结果(因为每个词或者不出现,或者至少出现在50%行中)

5、忽略词中的单引号,列如: don‘t  索引为dont

6、不具有词分隔符(包括日语和汉语)的语言不能恰当地返回全文本搜索结果

7、仅在myisam 数据引擎中支持全文本搜索

8、邻近搜索是许多全文本搜索支持的一个特定,它能搜索相邻的词(在相同的句子中,相同段落中或者在特定数目的词的部分中等等),但是MySQL全文本搜索现在不支持邻近操作符

9、MySQL使用 match() 和 against() 函数进行全文本搜索

10、查询扩展(WITH QUERY EXPANSION)

11、布尔文本搜索(IN BOOLEAN MODE)

MySQL ------ 全文本搜索( match和Against),以及查询扩展和 布尔方式(十七)

标签:数据引擎   pes   match   重要   常用   image   用处   customer   列表

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:https://www.cnblogs.com/obge/p/13028569.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值