MySQL全文搜索复数/单数形式的单词

时间:2012-03-27 15:57:29

标签: mysql full-text-search

我有一张这样的表

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..
...

还有两个问题:

  1. 返回上面的2条记录

    SELECT * FROM jobs WHERE MATCH (title,body) AGAINST ('developers')

  2. 返回空集

    SELECT * FROM jobs WHERE MATCH (title,body) AGAINST ('developer')

  3. 我认为MySQL可以通过'开发者'找到这些记录。但为什么它不起作用?

2 个答案:

答案 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%的情况也是如此。

干杯, 阿希什