mysql全文搜索案例,MySQL全文搜索之谜

本文探讨了MySQL全文搜索的问题,特别是当使用MATCH AGAINST时获得的结果与预期不符的情况。通过对比LIKE与全文搜索的不同表现,解释了全文搜索行为背后的原理,并提出了调整配置参数以改善搜索效果的建议。

我们在我们的网站上进行了简单的搜索,使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值