创建一个表:
create table test1(
note_text varchar(10),
FULLTEXT(note_text)
)
FULLTEXT(note_text) : 表示对note_text进行索引;
录入数据:
当我们查询字段中包含on
时:
select * from test1 where note_text like '%on%'
进行全文本搜索
select note_text from test1 where MATCH(note_text) AGAINST('on');
发现查询不出来结果;
原因是因为 系统定义的索引的单词的最小长度是4;
select note_text from test1 where MATCH(note_text) AGAINST('come');
结果:
现在就可以查询出来了;
select note_text,Match(note_text) Against('come') from test1;
此列包含全文本搜索计算出的等级值。等级由MySQL根据行中词的数目、唯一词的数目、整个索引中词的总数以及包含该词的行的数目计算出来。正如所见,不包含词come的行等级为0(因此不被前一例子中的WHERE子句选择)。确实包含词come的两个行每行都有一个等级值,文本中词靠前的行的等级值比词靠后的行的等级值高。
使用查询扩展
select note_text from test1 where MATCH(note_text) AGAINST('come' with query expansion);
这次返回了3行。第一行包含词come,因此等级最高。第二
行与come无关,但因为它包含第一行中的test,所以也被检索出来。
布尔文本搜索
select note_text from test1 where MATCH(note_text) AGAINST('come' in boolean mode);
全文本搜索检索包含词come的所有行(有两行)。其中使用
了关键字IN BOOLEAN MODE,但实际上没有指定布尔操作符,
因此,其结果与没有指定布尔方式的结果相同。
select note_text from test1 where MATCH(note_text) AGAINST('come -test*' in boolean mode);
仍然匹配词come,但-test明确地指示MySQL排除包含test(任何以test开始的词,包括tests)的行;
注意:
1.在索引全文本数据时,短词被忽略且从索引中排除。短词定义为那些具有3个或3个以下字符的词(如果需要,这个数目可以更改)。
2.MySQL带有一个内建的非用词(stopword)列表,这些词在索引全文本数据时总是被忽略。如果需要,可以覆盖这个列表(请参阅MySQL文档以了解如何完成此工作)。
3.许多词出现的频率很高,搜索它们没有用处(返回太多的结果)。因此,MySQL规定了一条50%规则,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略。50%规则不用于IN BOOLEAN MODE。
4.如果表中的行数少于3行,则全文本搜索不返回结果(因为每个词或者不出现,或者至少出现在50%的行中)。
5.忽略词中的单引号。例如,don’t索引为dont。
6.不具有词分隔符(包括日语和汉语)的语言不能恰当地返回全文本搜索结果。
参考书籍: