首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL全文搜索之谜

MySQL全文搜索之谜
EN

Stack Overflow用户
提问于 2011-01-30 08:20:31
回答 1查看 2.2K关注 0票数 4

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

下面是数据库表的结构:

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
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,我会得到一组不同的结果:

代码语言:javascript
复制
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专家能指出我们查询中的错误。

提前感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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%"都会搜索具有包含skiname列的行。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4840346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档