首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL 5.7与两个中文字词不匹配

MySQL 5.7与两个中文字词不匹配
EN

Stack Overflow用户
提问于 2018-04-17 22:35:16
回答 2查看 288关注 0票数 2

表tb:

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

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

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

代码语言:javascript
运行
复制
select * from tb where MATCH (keywords, title) AGAINST ('企业贷款');

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

但是,当我将它们与一个两个汉字的单词'贷款‘进行匹配时,没有匹配的结果。

代码语言:javascript
运行
复制
select * from tb where MATCH (keywords, title) AGAINST ('贷款');
|[
]|
EN

回答 2

Stack Overflow用户

发布于 2018-04-17 23:57:13

代码语言:javascript
运行
复制
ALTER TABLE tb
DROP INDEX `keywords_title ` ,
ADD FULLTEXT INDEX `keywords_title ` (`keywords` ASC, `title` ASC)  /*!70000 WITH PARSER `ngram` */ 

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

票数 0
EN

Stack Overflow用户

发布于 2019-07-26 18:58:08

代码语言:javascript
运行
复制
/*!70000 WITH PARSER ngram*/  

这意味着只有在MySQL版本为>= 7.0.0时才会执行语法,所以根本就没有使用ngram解析器。

在我的建议中,您仍然需要使用ngram解析器,因为默认的全文解析器不能很好地处理中文字符串(document中也提到了这一点)。

我在MySQL 5.7和8.0服务器上运行了一些测试,得到了相同的结果:

对于MyISAM

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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,内置的解析器只能使用一些符号(在本例中是逗号)来解析中文句子。解析器只捕获企业贷款令牌,而不捕获它的子字符串贷款。内置解析器
  2. 处理中文令牌的方式与处理英文令牌的方式相同。贷款的长度小于要索引的单词的最小长度(对于MyISAM,请检查ft_min_word_len设置;对于InnoDB,请检查innodb_ft_min_token_size ),因此即使贷款多次出现在keywords字段中,它也不会被索引。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49880926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档