mysql - 使用 MySQL 全文搜索匹配部分单词?

标签 mysql full-text-search

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

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 都找到)的最合适方法是什么?

最佳答案

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

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

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

关于mysql - 使用 MySQL 全文搜索匹配部分单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7910928/

相关文章:

php - 如何从 wp_options 这样的表中获取数据

php - MySQL数据库表命名约定

ios - 在 iOS 上处理大数据

android - 从 arraylist 中搜索任何文本

MySql全文搜索要考虑额外的问题

java - maven无法添加库

php - 按用户级别从 MySql 表中选择所有 ID,并将每个级别的 ID 数存储在数组中?

php - 如何使用 Volley 向 Mysql 数据库插入数据

java - 使用 Java 规范/谓词进行全文搜索

algorithm - 如何比较短语的相似性?