2012-03-27 81 views
5

我有這樣MySQL的全文搜索複數/詞的單數形式

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')

我認爲MySQL能夠發現這些記錄與 '開發商'。但爲什麼它不工作?

回答

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全文搜索中的語法分析。實際上,我今天正在研究這個問題,並沒有找到更好的東西。

編輯

此方法不適用於工作的話,如 '黨'(複數: '方')。如果您的搜索表單僅限於英語,我認爲您可以用一些簡單的語法規則來覆蓋大多數情況,並且對於每個單詞,搜索單詞及其複數。它是錯誤的,它可能會導致一個無效的單詞,這應該是在您的搜索中性。

+0

謝謝你,我想這有mysql的全文搜索引擎內沒有詞幹。我試圖理解並找到MySQL的最佳解決方案,而不是針對這種特殊情況^^。 – hungneox 2012-03-27 16:15:25

3
select * from index_table where item_name rlike '[[:<:]]preform[s]*[es]*[ies]*[[:>:]]'; 

檢查是否有幫助。我的情況下,它成功了。雖然不會覆蓋所有的複數,但90-95%的情況是。

乾杯, 阿希什