有人可以解释一下,我的 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
使用like
或regex
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 匹配为啥不工作的主要内容,如果未能解决你的问题,请参考以下文章