【发布时间】: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