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