- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们的网站上有一个使用 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 专家可以指出我们查询中的错误。
预先感谢您的帮助!
最佳答案
+
前导加号表示这个词必须出现在返回的每一行。
*
星号作为截断(或通配符)运算符。与其他运营商不同,它应该附加到单词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/
我一直在使用高精度时间在控制台中记录我的程序事件。但很快我就注意到程序有时会显示四舍五入到毫秒的时间,有时则不会!它完全偶尔发生,它是相同的代码,未重新编译,未在运行之间编辑: using Syste
首先:该代码被认为是纯粹的乐趣,请在生产中不要做任何类似的事情。在任何环境下编译并执行这段代码后,对于您,您的公司或您的驯鹿造成的任何伤害,我们概不负责。以下代码不安全,不可移植,并且非常危险。被警告
我正在投影图像,然后检查它: 高度是20px。这是正确的。 然后我检查包含 img 的 data-radium 元素,令我惊讶的是: 尽管没有内容,该元素的高度“增长”了两个像素。此外,data-ra
我是一名优秀的程序员,十分优秀!