我们在我们的网站上进行了简单的搜索,使用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专家可以在我们的查询中指出错误.
在此先感谢您的帮助!
解决方法:
>一个前导加号表示
这个词必须出现在
返回的每一行.
> *星号用作
截断(或通配符)运算符.
与其他操作符不同,它应该
附加到要成为的单词
影响.如果他们开始,单词匹配
用*之前的单词
操作符.
如果用.指定了一个单词
截断运算符,它不是
甚至从布尔查询中删除
如果它太短(确定
来自ft_min_word_len设置)或
一个停用词.这是因为
这个词不被视为太短或一个
禁止词,但作为必须的前缀
出现在文件中
以…开头的单词形式
字首.
在上下文中:
比赛(…)反对(…)
MATCH(名称)AGAINST(‘ski *’IN BOOLEAN MODE)表示您正在搜索名称列中的单词必须包含ski的行,并且必须以ski一词开头.
从您发布的集合中,达特茅斯滑雪道是唯一符合这些要求的名称:它包含单词ski,并以单词ski为前缀.
其他名称列虽然符合第一条规则:必须包含滑雪板,但它们不以滑雪为前缀,如规则中所规定.布尔搜索返回的行是唯一一个名称列,其中包含一个包含ski的单词,并且是一个以ski为前缀的单词.
正如ajreal建议的那样,尝试减少my.cnf中的ft_min_len_word_setting.由于默认设置,您的搜索可能无法提供您期望的结果.尝试将其减少到3.
WHERE列LIKE%text%
WHERE name LIKE“%ski%”搜索名称列包含ski的行,无论单词出现在何处.
标签:mysql,full-text-search
来源: https://codeday.me/bug/20190531/1188661.html
本文探讨了MySQL全文搜索的问题,特别是当使用MATCH AGAINST时获得的结果与预期不符的情况。通过对比LIKE与全文搜索的不同表现,解释了全文搜索行为背后的原理,并提出了调整配置参数以改善搜索效果的建议。
1510

被折叠的 条评论
为什么被折叠?



