表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 ('贷款');
|[
]|
2条答案
按热度按时间9lowa7mx1#
xj3cbfub2#
这意味着只有当mysql版本>=7.0.0时才会执行语法,所以您根本没有使用ngram解析器。
在我的建议中,您仍然需要使用ngram解析器,因为默认的全文解析器不能很好地处理中文字符串(文档中也提到了这一点)。
我在MySQL5.7和8.0服务器上运行了一些测试,得到了相同的结果:
为了myisam
对于innodb
首先,如果在自然语言模式下搜索,myisam引擎中有50%的阈值。两者
企业贷款
以及贷款
出现在超过一半的行中,mysql将它们视为stopwords(doc),因此它不返回任何内容。接下来,如果使用内置解析器,会导致奇怪的结果,因为解析器不能很好地处理这些表意文字语言。
你的处境有两个原因:
与ngram不同,内置解析器只能使用一些符号(在本例中是逗号)来解析中文句子。解析器只捕获
企业贷款
标记,但没有捕获它的子字符串贷款
.内置解析器处理中文标记的方式与处理英文标记的方式相同。长度
贷款
小于被认为是索引的单词的最小长度(检查ft_min_word_len
设置myisam,innodb_ft_min_token_size
对于innodb),因此即使贷款
发生在keywords
很多次。