【问题标题】:Multi-Column Name Search MySQL多列名称搜索 MySQL
【发布时间】:2011-02-28 04:28:41
【问题描述】:

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

用户搜索

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

【问题讨论】:

  • 感谢您的信任投票!!!

标签: mysql search wildcard where-clause


【解决方案1】:

您最好的选择是创建一个包含两个字段的 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 users 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

【讨论】:

  • 应用程序强制所有搜索都超过三个字,但我都不知道。好提示。但是我也需要允许部分匹配。
  • 但是你引导我创建上面的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
相关资源
最近更新 更多