表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 ('贷款');
|[
]|
发布于 2018-04-17 23:57:13
ALTER TABLE tb
DROP INDEX `keywords_title ` ,
ADD FULLTEXT INDEX `keywords_title ` (`keywords` ASC, `title` ASC) /*!70000 WITH PARSER `ngram` */
/*!70000 WITH PARSER
ngram*/
是必需的!
发布于 2019-07-26 18:58:08
/*!70000 WITH PARSER ngram*/
这意味着只有在MySQL版本为>= 7.0.0时才会执行语法,所以根本就没有使用ngram解析器。
在我的建议中,您仍然需要使用ngram解析器,因为默认的全文解析器不能很好地处理中文字符串(document中也提到了这一点)。
我在MySQL 5.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会将它们视为停止字(doc),因此它不返回任何内容。
接下来,如果您使用内置解析器,它会导致奇怪的结果,因为解析器不能很好地处理这些表意语言。
造成这种情况的原因有两个:
企业贷款
令牌,而不捕获它的子字符串贷款
。内置解析器贷款
的长度小于要索引的单词的最小长度(对于MyISAM,请检查ft_min_word_len
设置;对于InnoDB,请检查innodb_ft_min_token_size
),因此即使贷款
多次出现在keywords
字段中,它也不会被索引。https://stackoverflow.com/questions/49880926
复制相似问题