gpt4 book ai didi

MySQL全文搜索之谜

转载 作者:可可西里 更新时间:2023-11-01 07:29:11 25 4
gpt4 key购买 nike

我们的网站上有一个使用 MySQL 全文搜索的简单搜索,但出于某种原因,它似乎没有返回正确的结果。我不知道这是否是 Amazon RDS(我们的数据库服务器所在的位置)或我们请求的查询的某种问题。

这是数据库表的结构:

CREATE TABLE `items` (
`object_id` int(9) unsigned NOT NULL DEFAULT '0',
`slug` varchar(100) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`object_id`),
FULLTEXT KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

下面是对该表的简单全文搜索查询和返回的结果:

select object_id ,slug,name from items where MATCH (name) AGAINST ('+ski*' IN BOOLEAN MODE) order by name;

+-----------+-----------------------------------+------------------+
| object_id | slug | name |
+-----------+-----------------------------------+------------------+
| 10146041 | us/new-hampshire/dartmouth-skiway | Dartmouth Skiway |
+-----------+-----------------------------------+------------------+

如果我改为使用 LIKE,我会得到一组不同的结果:

select object_id,slug,name from items where name LIKE "%ski%" order by name;

+-----------+------------------------------------------+----------------------------------+
| object_id | slug | name |
+-----------+------------------------------------------+----------------------------------+
| 10146546 | us/new-york/brantling-ski | Brantling Ski |
| 10146548 | us/new-york/buffalo-ski-club | Buffalo Ski Club |
| 10146041 | us/new-hampshire/dartmouth-skiway | Dartmouth Skiway |
| 10146352 | us/montana/discover-ski | Discover Ski |
| 10144882 | us/california/donner-ski-ranch | Donner Ski Ranch |
| 10146970 | us/new-york/hickory-ski-center | Hickory Ski Center |
| 10146973 | us/new-york/holimont-ski-area | Holimont Ski Area |
| 10146283 | us/minnesota/hyland-ski | Hyland Ski |
| 10145911 | us/nevada/las-vegas-ski-snowboard-resort | Las Vegas Ski & Snowboard Resort |
| 10146977 | us/new-york/maple-ski-ridge | Maple Ski Ridge |
| 10146774 | us/oregon/mount-hood-ski-bowl | Mt. Hood Ski Bowl |
| 10145949 | us/new-mexico/sipapu-ski | Sipapu Ski |
| 10145952 | us/new-mexico/ski-apache | Ski Apache |
| 10146584 | us/north-carolina/ski-beech | Ski Beech |
| 10147973 | canada/quebec/ski-bromont | Ski Bromont |
| 10146106 | us/michigan/ski-brule | Ski Brule |
| 10145597 | us/massachusetts/ski-butternut | Ski Butternut |
| 10145117 | us/colorado/ski-cooper | Ski Cooper |
| 10146917 | us/pennsylvania/ski-denton | Ski Denton |
| 10145954 | us/new-mexico/ski-santa-fe | Ski Santa Fe |
| 10146918 | us/pennsylvania/ski-sawmill | Ski Sawmill |
| 10145299 | us/illinois/ski-snowstar | Ski Snowstar |
| 10145138 | us/connecticut/ski-sundown | Ski Sundown |
| 10145598 | us/massachusetts/ski-ward | Ski Ward |
+-----------+------------------------------------------+----------------------------------+

我完全不知道为什么使用全文搜索的查询不起作用。我希望那里的一些 MySQL 专家可以指出我们查询中的错误。

预先感谢您的帮助!

最佳答案

来自MySQL docs

  • + 前导加号表示这个词必须出现在返回的每一行。

  • * 星号作为截断(或通配符)运算符。与其他运营商不同,它应该附加到单词be做作的。开头的单词匹配在 * 之前的单词运营商。

    如果用截断运算符,它不是从 bool 查询中剥离,甚至如果它太短(确定来自 ft_min_word_len 设置)或停用词。发生这种情况是因为单词不被视为太短或停用词,但作为前缀必须出现在文档中以 the 开头的词的形式前缀

在上下文中:

匹配(...) 反对(...)

MATCH (name) AGAINST ('+ski*' IN BOOLEAN MODE) 表示您正在搜索 name 列中的单词的行 必须包含ski,并且必须以单词ski开头。

在您发布的集合中,Dartmouth Skiway 是唯一符合这些要求的名称:它包含单词 ski,并以单词 ski 为前缀。

其他 name 列,虽然它们符合第一条规则:必须包含 ski,但它们没有前缀 em> ski,按照你的规则规定。您的 bool 搜索返回的行是唯一具有 name 列的行,该列包含一个既 contains ski 又是一个词 ski 为前缀

按照 ajreal 的建议,尝试减少 my.cnf 中的 ft_min_len_word_setting。由于默认设置,您的搜索可能无法得出您期望的结果。尝试将其减少到 3。

WHERE 列 LIKE %text%

WHERE name LIKE "%ski%" 搜索 name 列包含 ski 的行,无论该词出现在何处。

关于MySQL全文搜索之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4840346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com