有人可以解释一下,我的 mysql 匹配为啥不工作

Posted

技术标签:

【中文标题】有人可以解释一下,我的 mysql 匹配为啥不工作【英文标题】:Can some explain me, my mysql match against why not working有人可以解释一下,我的 mysql 匹配为什么不工作 【发布时间】:2021-08-10 14:09:10 【问题描述】:

我在链接列上使用mysql全文

但有时文本匹配,有时它不起作用

我有例子

http://sqlfiddle.com/#!9/470eb28/6

CREATE TABLE domains
    (`name` varchar(300))
 ENGINE=InnoDB;
    
INSERT INTO domains
    (`name`)
VALUES
    ('https://www.google.com'),
    ('https://www.yahoo.com'),
    ('https://www.instagram.com/painfreestrength/')
;

CREATE FULLTEXT INDEX idx_1 ON domains (`name`);

查询

select * from domains where match(name) against('"painfrees"')

【问题讨论】:

创建一个小提琴很好,但您也应该将其内容复制到问题中。这样,当链接失效时,您的问题仍将保留所有相关信息。 必须使用Match 吗? 更改匹配后无法正常工作sqlfiddle.com/#!9/470eb28/14 【参考方案1】:

在针对大型数据库的性能方面,您无法提高效率,尤其是当您应该使用 LIKE 模式时,假设表结构与您在问题中提出的完全一样,假设您已经拥有列索引。

一种可行的方法是使用“名称”列按字母顺序优化数据库,并限制搜索 N 行,这将大大改善您的查询。

您可以做的另一件事是提取根域并将其保存在另一列中,这将提高性能。

【讨论】:

【参考方案2】:

匹配将要求您使用整个单词

select * from domains where MATCH(`name`) AGAINST('wholeword') 

即适合你的情况

select * 
from domains where MATCH(`name`) AGAINST('"https://www.instagram.com/painfreestrength/"')

select * 
from domains where MATCH(`name`) AGAINST('"painfreestrength"')

select * 
from domains where MATCH(`name`) AGAINST('"instagram"')

但是如果你必须使用painfrees

使用likeregex

select * from domains where name like "%painfrees%"

select * from domains where REGEXP_LIKE(name, 'painfrees')

【讨论】:

但是这个用户搜索,我怎么能控制它,他们搜索任何东西 您要搜索所有列吗? 不是只有一列,如果你搜索 painfreestrength 也可以 我只需要知道 mysql 在 MATCH AGAINST 上使用什么算法 @webphp 它匹配一个完整的单词,单词也可以在字符之间。这就是为什么你看到FULLTEXT这个词我想【参考方案3】:

试试这个

select * from domains where name like '%painfrees%';

【讨论】:

如果我这样做,表已经有 100 万行,那么查询需要很长时间 使用弹性搜索。那么这个数据库不值得。 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。

以上是关于有人可以解释一下,我的 mysql 匹配为啥不工作的主要内容,如果未能解决你的问题,请参考以下文章

“不匹配运算符>>”但我不明白为啥。请给我解释一下好吗?

为啥打印结果与实物不符

请有人可以解释为啥我在下面收到错误消息?

Python socket Recv 无法正常工作,有人可以解释一下吗

有人可以解释为啥我的最后一个 else 语句不会运行吗?

有人可以解释这两个 http 调用之间的区别以及为啥一个失败而另一个没有?