【问题标题】:Workaround for the MySQL 50% threshold for natural searchMySQL 50% 自然搜索阈值的解决方法
【发布时间】:2023-03-13 12:02:01
【问题描述】:

我有一个表格,我在其中插入图像和在所述图像中找到的颜色名称。颜色字符串看起来像:

白色、黄色、橙色、黑色

由于我有很多这些,50% 的阈值开始降低一些颜色,因为它们出现在大多数行上。

表格的重点是能够按颜色进行搜索。有没有人有解决方法,还是我应该放弃并选择 Sphinx 或类似的东西?重新编译 MySQL 可能不是一种选择。

我听说有些人只是在表中添加虚拟行以绕过 50%,但这听起来很绝望。

【问题讨论】:

    标签: mysql search full-text-search


    【解决方案1】:

    这不是全文搜索可以解决的问题。

    相反,您需要一个子表,其中每个图像每种颜色一行。

    颜色应该是颜色表的外键,所以你的子表实际上变成了图像和颜色之间的多对多关系。

    create table color ( 
     id int not null primary key auto_increment,
     name varchar64)
    ); 
    
    create table image_color (
      image_id int references image(id), 
      color_id int reference color(id),
      unique constraint (image_id, color_id) 
    ) ;
    

    然后索引关系(并在元组(image_id,color_id)上给它一个唯一的约束。

    然后查找具有特定颜色的所有图像:

    select a.* from image a 
    join image_color b on (a.id = b.image_id) 
    join color c on (b.color_id = c.id)
    where c.name = 'yellow';
    

    【讨论】:

      【解决方案2】:

      表格的重点是能够按颜色进行搜索。有人有解决方法吗

      是的,使用BOOLEAN MODE 搜索,它不受 50% 阈值的影响,并且更不可预测。

      但是,对 tpdi 的回答 +1,我无法想象您为什么使用全文搜索而不是列出颜色的简单连接表。这是一个简单的是/否逻辑存储问题,无需拖入全文复杂的分词、词序、停用词、太短的词(默认情况下不会索引“红色”)以及最重要的事实您必须使用令人讨厌的旧 MyISAM 表才能获得该功能!

      全文搜索通常很难,并且在 MySQL 中实现得不是特别好。当您确实需要在大量文本中搜索单词时,它应该是您最后的选择,而不是作为选择的功能。

      【讨论】:

      • 布尔模式返回的结果基本没有价值。
      • 为什么它们“一文不值”?你看到了什么“错误”的结果?它对我来说很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 2011-01-03
      • 1970-01-01
      相关资源
      最近更新 更多