【问题标题】:Why is the MySQL MATCH function returning a relevance score of 0, but is considered true?为什么 MySQL MATCH 函数返回的相关性分数为 0,但被认为是真的?
【发布时间】:2021-06-06 20:26:16
【问题描述】:

我在 MySQL 中有下表:

CREATE TABLE events(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`title` VARCHAR(128) NOT NULL,
`datetime` DATETIME  NOT NULL,
`duration` TIME  NULL,
`websiteUrl` VARCHAR(128) NULL,
`location` VARCHAR(128) NULL,
`mapUrl` VARCHAR(256) NULL,
`summary` TEXT NULL,
`text` TEXT NULL,
`thumbUrl` VARCHAR(128) NULL,
`imgUrl` VARCHAR(128) NULL,
`created` DATETIME  NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated` DATETIME  NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FULLTEXT(title),
FULLTEXT(summary),
FULLTEXT(text),
INDEX(created)
) ENGINE = INNODB  DEFAULT CHARSET = utf8;

INSERT INTO `events` 
(
    `id`, 
    `title`, 
    `summary`, 
    `text`, 
    `datetime`, 
    `duration`, 
    `location`, 
    `mapUrl`, 
    `websiteUrl`, 
    `thumbUrl`, 
    `imgUrl`, 
    `created`, 
    `updated`, 
    `author`
) VALUES (
    1, 
    'Stuff', 
    'Some weird stuff is gonna happen', 
    '<p>You don't even want to know<br></p>\n', 
    '2023-10-14 23:41:00', 
    '09:01:33', 
    NULL, 
    NULL, 
    NULL, 
    'upload/events/thumb/newstuff5f28482474c9d.jpg', 
    'upload/events/img/newstuff5f28482477dab.jpg', 
    '2020-08-03 11:23:48',
    '2020-08-03 11:23:48',
    NULL
);

我想使用全文索引实现一个简单的搜索功能。我对表运行了以下查询,只是为了测试并确保我的 SQL 代码正常工作:

SELECT 
    "events" AS `table`,
    `id` AS `id`,
    "stuff" AS `query`,
    "events" AS `category`,
    `thumbUrl` AS `thumbnail`, 
    `datetime` AS `timestamp`, 
    `title` AS `title`, 
    `summary` AS `summary`, 
    `text` AS `content`, 
    ( MATCH (`title`) AGAINST ("stuff" IN NATURAL LANGUAGE MODE) * 10 
    + MATCH (`summary`) AGAINST ("stuff" IN NATURAL LANGUAGE MODE) * 3 
    + MATCH (`text`) AGAINST ("stuff" IN NATURAL LANGUAGE MODE) * 1 + 0 
    ) AS `relevance`
FROM `events`
WHERE (
    MATCH (`title`) AGAINST ("stuff" IN NATURAL LANGUAGE MODE) 
    OR MATCH (`summary`) AGAINST ("stuff" IN NATURAL LANGUAGE MODE) 
    OR MATCH (`text`) AGAINST ("stuff" IN NATURAL LANGUAGE MODE)
) 

此处的目的是使标题的相关性得分高于摘要的相关性得分,以及摘要的权重高于正文的相关性得分。我以前对非常相似的表使用过非常相似的查询,通常它似乎工作正常。然而,在这张桌子上它的动作似乎很奇怪。我收到以下错误:

SQLSTATE[22003]: Numeric value out of range: 1690 DOUBLE value is out of range in '((match `test`.`events`.`summary` against ('stuff')) * 3)'

如果我将查询更改为不对相关分数执行任何数学运算,而是直接返回它们,那么所有三个匹配语句的分数都是0。然而,OR 将所有三个假设的0s 放在一起的结果是1,这让我认为它们实际上不是0。为了证实这种怀疑,我分别测试了所有三个配置,尽管所有三个匹配语句显然都返回了0,但标题和摘要列的匹配语句在用作布尔值时被认为是正确的。

更改查询无济于事,除非我将其更改为与任何行都不匹配的内容。

谁能向我解释为什么会这样?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    在输入上面的长问题后,我找到了答案here。本质上,我得到这个奇怪结果的原因是因为我在用于测试的表中只有一行。 MySQL 中显然有一条 50% 规则,即忽略全文索引中 50% 或更多行中出现的单词。由于我的表中只有一行,因此全文索引基本上没有用,因为所有单词都出现在 100% 的行中。

    还是决定发布这个问题,只是因为最终为我解决的问题有点晦涩难懂。希望下一个遇到问题的人可以找到这个问题,而不必花费一整天的时间来解决一旦表格中包含一些真实数据就不会成为问题的问题。

    【讨论】:

      猜你喜欢
      • 2016-06-22
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 2016-04-22
      • 2015-09-29
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      相关资源
      最近更新 更多