2011-02-28 132 views
2

我目前正在進行實時搜索,我需要能夠在兩列中找到部分名稱(我們需要分隔名和姓)。我個人希望保留命令短,但我已經能夠得到這個工作的唯一途徑是:多列名稱搜索MySQL

用戶搜索

John Doe 

生成的SQL查詢

SELECT * FROM users WHERE 
(first_name LIKE '%john%' OR last_name LIKE '%john%') AND 
(last_name LIKE '%doe%' OR last_name LIKE '%doe%'); 

搜索字段是一個框,所以我做了一些簡單的空間分隔。大多數情況下,這不會超出三組條款,只是想知道是否有更好的方法來做到這一點。

注意: 我想能夠做部分匹配。所以,我應該能夠找到李四,如果我找「約翰待辦事項」

解決方案 隨着羅蘭的幫助下,我卻沒有拿出一個解決方案,張貼別人誰發現這一點。按照他的關於如何創建下面的指標說明,然後運行這個:

SELECT * FROM users WHERE 
(MATCH(first,last) AGAINST ('+john* +do*' IN BOOLEAN MODE)) 
+0

謝謝您的信任投票! – RolandoMySQLDBA 2011-02-28 16:50:14

回答

5

你這裏最好的辦法是創建一個包含兩個字段

步驟1)創建只是一個停用詞文件FULLTEXT指數三個字

回聲 「一」> /var/lib/mysql/stopwords.txt
回聲 「一個」 >> /var/lib/mysql/stopwords.txt
回聲 「該」 >>的/ var/lib/mysql/stopwords.txt

步驟2)添加這些選項來在/etc/my.cnf

的ft_min_word_len = 2
ft_stopword_file =的/ var/lib中/ MySQL的/ stopWords.txt中

步驟3)在所述第一創建FULLTEXT索引和姓氏列

ALTER TABLE用戶ADD FULLTEXT first_last_name_index(first,last);

步驟4)實行MATCH函數在搜索

是這樣的:

SELECT * FROM用戶WHERE(MATCH(第一,最後)反對( '約翰' IN BOOLEAN MODE))AND( MATCH(第一,最後)反對('Doe'BOOLEAN模式));

Click here to Learn More about FULLTEXT indexing

+0

該應用程序強制所有搜索超過三個字,因爲它,但我都不知道。好的提示。不過,我需要允許部分匹配。 – 2011-02-28 05:16:00

+0

但是,您會引導我創建上述解決方案! – 2011-02-28 05:34:51