【问题标题】:Match partial words using MySQL Fulltext search?使用 MySQL 全文搜索匹配部分单词?
【发布时间】:2023-01-02 20:31:03
【问题描述】:

我有以下数据库模式,例如:

CREATE TABLE IF NOT EXISTS `items` (
  `id` int(11) unsigned NOT NULL,
  `irn` varchar(30) NOT NULL,
  `name` varchar(225) NOT NULL,
  `description` text,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `name_desc_irn` (`name`,`description`,`irn`),
  FULLTEXT KEY `name` (`name`),
  FULLTEXT KEY `description` (`description`),
  FULLTEXT KEY `irn` (`irn`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

以及以下数据(假设这里的数据是简化的,实际上我有超过 100,000 条记录)

id    name        irn          description     
1     Widget A    ABC12345     testing ABC12345
2     Widget B    ABC-12345    the ABC is great

以及以下查询:

SELECT
    items.id as id,
    items.irn as irn,
    items.name as name,
    (
        ((MATCH (irn) AGAINST ('12345')) * 5) + 
        ((MATCH (name) AGAINST ('12345')) * 4) + 
        ((MATCH (description) AGAINST ('12345')) * 3) + 
        (MATCH(name, description, irn) AGAINST ('12345'))
    ) AS relevance 
FROM
    items 
WHERE 
    MATCH(name, description, irn) AGAINST ('*12345' IN BOOLEAN MODE)
HAVING
    relevance > 0
ORDER BY
    relevance DESC

返回第二个结果(ABC-12345 irn),但不返回第一个结果(ABC12345)。为什么它不匹配 ABC12345 但匹配 ABC-12345?有什么办法可以使用全文搜索来匹配两者吗?如果不是,那么在搜索 12345 时,进行这种类型的搜索(ABC12345 和 ABC-12345 都找到)的最合适方法是什么?

【问题讨论】:

    标签: mysql full-text-search


    【解决方案1】:

    关于 * 布尔全文搜索运算符,我能给你的唯一信息是,根据 MySQL Manual,“与其他运算符不同,它应该附加到要受影响的词后面。”

    对于这种特定类型的查询,您唯一的选择可能是将您的 where 子句更改为:

    WHERE irn LIKE '%12345' OR name LIKE '%12345' OR description LIKE '%12345'
    

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 1970-01-01
      • 2018-10-23
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多