【问题标题】: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

标签: php mysql match-against


【解决方案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 万行,那么查询需要很长时间
    • 使用弹性搜索。那么这个数据库不值得。
    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多