多列名称搜索MySQL

时间:2011-02-28 04:28:42

标签: mysql search wildcard where-clause

我目前正在进行实时搜索,我需要能够在两列中找到名称的一部分(我们需要分隔名字和姓氏)。我个人希望保持命令简短,但是我能够让它工作的唯一方法是:

用户搜索

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

搜索字段是一个框,所以我按空格做了一些简单的分隔。大多数情况下这不会超出三套条款,只是想知道是否有更好的方法来做到这一点。

注意: 我希望能够进行部分匹配。所以,如果我寻找“John Do”,我应该能够找到John Doe

在Rolando的帮助下,我确实提出了一个解决方案,发布给其他发现此问题的人。按照他的说明如何在下面创建索引,然后运行:

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

1 个答案:

答案 0 :(得分:5)

这里最好的选择是创建一个包含两个字段的FULLTEXT索引

步骤1)创建一个只有三个单词的停用词文件

echo“a”> /var/lib/mysql/stopwords.txt
echo“an”>> /var/lib/mysql/stopwords.txt
echo“the”>> /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 users WHERE(MATCH(first,last)AGAINST('John'IN BOOLEAN MODE))AND(MATCH(first,last)AGAINST('Doe'IN BOOLEAN MODE));

Click here to Learn More about FULLTEXT indexing