2

表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 ('贷款');
|[
]|
4

2 回答 2

0
/*!70000 WITH PARSER ngram*/  

这意味着该语法只会在 MySQL 版本 >= 7.0.0 时执行,因此您根本没有使用 ngram 解析器。

在我的建议中,你还是需要使用ngram解析器,因为默认的全文解析器不能很好的处理中文字符串(这个在文档中也有提到)。

我在 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),因此它什么也不返回。

接下来,如果你使用内置的解析器,它会导致奇怪的结果,因为解析器不能很好地处理这些表意语言。

你的情况有两个原因:

  1. 与 ngram 不同,内置解析器只能使用一些符号(在本例中为逗号)来解析中文句子。解析器只捕获企业贷款token 而没有捕获它的 sub-string 贷款
  2. 内置解析器处理中文标记的方式与处理英文标记的方式相同。的长度贷款小于考虑索引的单词的最小长度(检查ft_min_word_lenMyISAM 的设置,innodb_ft_min_token_size对于 InnoDB),因此即使贷款keywords字段中多次出现也不会被索引。
于 2019-07-26T10:58:08.197 回答
0
ALTER TABLE tb
DROP INDEX `keywords_title ` ,
ADD FULLTEXT INDEX `keywords_title ` (`keywords` ASC, `title` ASC)  /*!70000 WITH PARSER `ngram` */ 

/*!70000 WITH PARSERngram*/ 是必要的!

于 2018-04-17T15:57:13.453 回答