mysql 5.7两个汉字单词的误匹配

iugsix8n  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(351)

表tb:

title                       keywords
企业贷款,该如何看懂银行流水     出口退税,贷款,现金流量表,利润表
最高人民法院关于审理民间        企业贷款,合同法,贷款
中国宏观经济数据点评           企业贷款,贷款

ngram_token_size=2
FULLTEXT INDEX `keywords_title`(`keywords`, `title`)

现在我将关键字和标题与一个四个汉字的单词匹配企业贷款'

select * from tb where MATCH (keywords, title) AGAINST ('企业贷款');

|[
title                       keywords
企业贷款,该如何看懂银行流水     出口退税,贷款,现金流量表,利润表
最高人民法院关于审理民间        企业贷款,合同法,贷款
中国宏观经济数据点评           企业贷款,贷款
]|

但是当我用一个两个汉字的单词贷款', 没有匹配的结果。

select * from tb where MATCH (keywords, title) AGAINST ('贷款');
|[
]|
9lowa7mx

9lowa7mx1#

ALTER TABLE tb
DROP INDEX `keywords_title ` ,
ADD FULLTEXT INDEX `keywords_title ` (`keywords` ASC, `title` ASC)  /*!70000 WITH PARSER `ngram` */
``` `/*!70000 WITH PARSER` 恩格拉姆 `*/` 是必须的!
xj3cbfub

xj3cbfub2#

/*!70000 WITH PARSER ngram*/

这意味着只有当mysql版本>=7.0.0时才会执行语法,所以您根本没有使用ngram解析器。
在我的建议中,您仍然需要使用ngram解析器,因为默认的全文解析器不能很好地处理中文字符串(文档中也提到了这一点)。
我在MySQL5.7和8.0服务器上运行了一些测试,得到了相同的结果:

为了myisam

X: return empty result  O: return rows contain the pattern

built-in parser
  IN NATURAL LANGUAGE MODE (default)
    企业贷款    X
    贷款        X
  IN BOOLEAN MODE
    企业贷款    O
    贷款        X

ngram
  IN NATURAL LANGUAGE MODE (default)
    企业贷款    X
    贷款        X
  IN BOOLEAN MODE
    企业贷款    O
    贷款        O

对于innodb

built-in parser
  IN NATURAL LANGUAGE MODE (default)
    企业贷款    O
    贷款        X
  IN BOOLEAN MODE
    企业贷款    O
    贷款        X
ngram
  IN NATURAL LANGUAGE MODE (default)
    企业贷款    O
    贷款        O
  IN BOOLEAN MODE
    企业贷款    O
    贷款        O

首先,如果在自然语言模式下搜索,myisam引擎中有50%的阈值。两者 企业贷款 以及 贷款 出现在超过一半的行中,mysql将它们视为stopwords(doc),因此它不返回任何内容。
接下来,如果使用内置解析器,会导致奇怪的结果,因为解析器不能很好地处理这些表意文字语言。
你的处境有两个原因:
与ngram不同,内置解析器只能使用一些符号(在本例中是逗号)来解析中文句子。解析器只捕获 企业贷款 标记,但没有捕获它的子字符串 贷款 .
内置解析器处理中文标记的方式与处理英文标记的方式相同。长度 贷款 小于被认为是索引的单词的最小长度(检查 ft_min_word_len 设置myisam, innodb_ft_min_token_size 对于innodb),因此即使 贷款 发生在 keywords 很多次。

相关问题