MySql中MATCH函数使用

7,805 阅读2分钟

最近在做mysql优化,涉及到match函数的使用,特意整理一下。

使用MATCH的使用介绍:

1.语法糖:

MATCH(title) against('KEY' IN BOOLEAN MODE)
MATCH(title,body) against('KEY' IN BOOLEAN MODE)

2.使用注意:

MySql默认支持全文检索的字符长度是4
可以用SHOW VARIABLES LIKE 'ft_min_word_len' 来查看指定的字符长度
也可以在mysql配置文件my.ini 更改最小字符长度,在my.ini 增加一行
比如:ft_min_word_len = 2,改完后重启mysql即可。

mysql在集和查询中的对每个合适的词都会先计算它们的权重,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个特定的集中,它有较低的语义值。
否则,如果词是较少的,它将得到一个较高的权重,mysql默认的阀值是50%,上面‘you’在每个文档都出现,因此是100%,只有低于50%的才会出现在结果集中。

3.检索表达式及语法

一。MATCH(title) against('+zhang -lishi ~wangwu zhaoliu*' IN BOOLEAN MODE)
   +表示and,-表示not,~表示异或运算符,*表示所有,空格表示or 等等

4.特殊符号处理

当全文检索碰到特殊符号的时候,会触发函数自动对检索条件进行分词搜索。
注意:一些特殊符号属于函数的保留符号,函数会把符号解析成条件进行分词
例如:欣欣贸易(北京)有限公司 会自动拆分成 欣欣贸易,北京,有限公司去做搜索,返回包含欣欣贸易或者北京或者有限公司的记录。

这里注意下:mysql默认检索长度是4,这些条件中北京是两个字符,不会触发检索
也就是说最后检索的结果是只包含 欣欣贸易和有限公司 这两个条件的数据

不触发自动分词,需要把自己的检索条件用“双引号”包含起来
例如:MATCH(title) against('“欣欣贸易(北京)有限公司” “大华贸易(北京)股份有限公司”' IN BOOLEAN MODE)

上面所述希望能对大家有帮助!
虽然上面这些能解决一部分问题,但是还是一些遗留新得问题产生:
虽然加上双引号能够使用,但是其实还是触发了分词,比如 欣欣贸易(北京)有限公司
它还是被分成 欣欣贸易(北京)和有限公司
如果你mysql默认检索字符长度没有改变 还是4,那么遇到 贸易(北京)有限公司 这样得查询条件还是丢失了精准度。
如果有那么大佬知道原因,还望告知一二