我有一张这样的表
CREATE TABLE jobs(
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
) ENGINE=MyISAM;
此表中有两条记录
...
7. 10 Senior PHP Developers (Leaders)
8. 30 PHP Developers..
...
还有两个问题:
返回上面的2条记录
SELECT * FROM jobs WHERE MATCH (title,body) AGAINST ('developers')
返回空集
SELECT * FROM jobs WHERE MATCH (title,body) AGAINST ('developer')
我认为MySQL可以通过'开发者'找到这些记录。但为什么它不起作用?
答案 0 :(得分:4)
您可以使用布尔运算符切换到全文:http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html
并搜索:
SELECT * FROM jobs WHERE MATCH (title,body) AGAINST ('developer*' IN BOOLEAN MODE)
您首先会获得“开发者”的匹配,然后是“开发人员”或以“开发者”开头的任何字符串。对于作为“开发者”的长篇精确单词来说很好,但是搜索“car *”会导致很多意想不到的结果,比如'card','cardamon',....
我不认为MySQL全文搜索中存在语法分析。我今天实际上正在研究这个问题,但没有找到更好的东西。
修改强>
此方法不适用于“派对”(复数:'派对')等字词。如果您的搜索表单仅限于英语,我认为您可以使用一些简单的语法规则来涵盖大多数情况,并且对于每个单词,搜索单词及其复数。它是错的,它可能会导致一个无效的单词,在你的搜索中应该是中性的。
答案 1 :(得分:4)
select * from index_table where item_name rlike '[[:<:]]preform[s]*[es]*[ies]*[[:>:]]';
检查这是否有帮助。我的情况很好。虽然不会涵盖所有复数,但是90-95%的情况也是如此。
干杯, 阿希什