我们在我们的网站上有一个使用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专家能指出我们查询中的错误。
提前感谢您的帮助!
发布于 2011-01-30 08:35:03
来自MySQL docs
前导加号表示此单词必须出现在returned.
*的每一行中。星号用作截断(或通配符)运算符。与其他运算符不同,它应该附加到要受影响的单词后面。如果单词以*运算符之前的单词开头,则匹配。如果使用截断运算符指定了单词,则不会从布尔查询中删除该单词,即使该单词太短(由ft_min_word_len设置确定)或停止字也是如此。这是因为该单词不会被视为太短或停用词,而是必须以以前缀开头的单词形式出现在文档中的前缀。
在上下文中:
匹配(...)针对(...)
MATCH (name) AGAINST ('+ski*' IN BOOLEAN MODE)表示要搜索name列中的单词必须包含ski且必须以单词ski开头的行。
在您发布的集合中,Dartmouth Skiway是唯一符合这些要求的name:它包含单词ski,并以单词ski为前缀。
其他name列,虽然它们符合第一个规则:必须包含ski,但它们不会像您的规则中规定的那样以ski为前缀。布尔搜索返回的行是唯一一个具有name列的行,该列包含既包含ski又是以ski为前缀的单词。
根据ajreal的建议,尝试减少my.cnf中的ft_min_len_word_setting。由于默认设置,您的搜索可能找不到预期的结果。试着把它减到3。
类似%text%的WHERE列
无论单词出现在何处,WHERE name LIKE "%ski%"都会搜索具有包含ski的name列的行。
https://stackoverflow.com/questions/4840346
复制相似问题