时间:2021-07-01 10:21:17 帮助过:59人阅读
在索引之后,select可与match() 和against()一起使用以实际执行索引。
那么,在建表的时候,如何启用全文本搜索支持呢???
如下:
上面就这样通过fulltext 为指定行建立的相应的索引,如果,想指定多个列,将多个列都放入fulltext里面即可。
在定义之后,MySQL会自动维护该索引。无论是在增加、更新还是删除,索引也会随之更新。
上面在建表后此表就有了全文本搜索的能力了,下面我们开始尝试下全文本搜索。
在索引之前,我为test_text表增加了如下内容:
当我们想利用全文本搜索得到 包含MySQL内容的数据。
如下:
select * from test_text where match(content) against(‘MySQL‘);
上面语句中 match(content) 指示MySQL针对指定的列进行搜索,注意:传递给match()的值必须与fulltext()定义中的相同。against(‘MySQL’)指定词MySQL作为搜索文本。
从结果可以看出,我们得到了两行包括MySQL字符串的数据。
上面的搜索利用我们学过的Like也可以完成,如下:
这两种方法的结果是一样的。次序也一样,理论上来说,利用全文本搜索会对出来的结果按照优先级来进行排序输出,但是从结果可以看出,在第一条语句中MySQL出现的位置相比第二条语句中的MySQL的位置还要滞后,为什么会出现在前面呢??,与MySQL必知必会上面介绍的有一点出入
为了验证上面出现的问题,我们可以查下结果的优先级。在查看优先级之前,我又加入了一个以MySQL开头的行数据。下面举来看下优先级。
select id,content,match(content) against(‘MySQL‘) from test_text ;
从结果可以看出,确实是id=7的行的优先级大于id=8的优先级,原因在于优先级并不至于出现的先后位置有关系,还与诸如文本长度等因素也有关系。
在增加了一行以MySQL开头的行数据之后,我们来一起观察下上面这两种方法的结果。
从上面两图可以明显看出,确实,利用全文本搜索对搜索到的内容进行一定的排序,而通配符却没有进行排序。至于全文本搜索对搜索到的内容进行排序由很多因素来进行决定,比如:出现的位置、出现的次数、文本自身的长度等等。
等级越高,出现的位置就越靠前,在我们生活中使用的搜索引擎(例如百度、google等)进行搜索东西的时候,我相信也是按照这样的逻辑来出现结果,当然除了百度公司收了别人钱把不匹配的内容人为的放在更前面。
前面介绍的只是普通的全文本搜索。
但是,我们在生活中常常有更严格的要求,例如,我希望搜索 的内容包括MySQL字符串,你还想得到与MySQL相关的内容(即使没有出现MySQL字眼),应该怎么来做呢??
这就需要我们使用查询扩展了。
用法 :在against(关键字 with query expansion) 即可
从结果可以看出,当我们使用了查询扩展之后,就得到了更多相关的内容,即使这些内容不包括MySQL字眼。
至于MySQL是如何根据MySQL来得到与之相关的关键字,目前我还不清楚。
MySQL支持全文本搜索的另外一种形式,称为布尔方式。以布尔方式,可以提供如下内容的细节:
- 要匹配的词;
- 要排斥的词、
- 排列提示(指定某些词比其他词更重要,更重要的词等级更高)
- 表达式分组。
要说明的是:即使没有fulltext索引也可以使用,只是速度相当相当的慢。
为显示 in boolean mode的作用,以一个简单的例子来进行说明。
select * from test_text where match(content) against(‘MySQL -interesting‘ in boolean mode);//返回必须包含MySQL不能包含interesting内容的数据。
关于全文本布尔操作符,见下表(来源于:《MySQL必知必会》这本书)
关于全文本布尔操作符的具体使用实例,与上面的例子类似,这里不在进行具体介绍。
1、MySQL带有一个内建的非用词列表。这些词在索引全文本数据时总是被忽略。如果需要,可以覆盖这个列表。
2、许多词出现的频率很高,搜索他们没有用处(因为返回太多的结果)。因此,MySQL规定了一条50%规则,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略。50%规则不用于in boolean mode.
3、如果表中的数据的行数小于3行,则全文本搜索不返回结果。因此每个词要么不出现,出现就至少为50%。
4、忽略词中的单引号。例如:don’t 索引为dont。
mysql 文本搜索
标签:索引 引擎 位置 没有 src 生活 排序 决定 ddn