不工作在mysql多搜索中搜索不完整的单词

时间:2013-11-27 01:26:57

标签: mysql

我有一个mysql代码,您可以在其中搜索多个单词并显示可能的结果

员工表

ID firstname  lastname      bandname
------------------------------------
 1 John       Lennon        Beatles
 2 Paul       Mccartney     Beatles
 3 Ringo      Starr         Beatles
 4 George     Harrison      Beatles

在这里输入“John Paul”时,结果是John Lennon和Paul Mccartney

查询

set @search = 'George Ringo';

SELECT *
FROM employee
WHERE @search LIKE CONCAT('%',id,'%')
   OR @search LIKE CONCAT('%',firstname,'%')
   OR @search LIKE CONCAT('%',lastname,'%');

set @search = '1 Paul Starr';

SELECT *
FROM employee
WHERE @search LIKE CONCAT('%',id,'%')
   OR @search LIKE CONCAT('%',firstname,'%')
   OR @search LIKE CONCAT('%',lastname,'%');

但现在的问题是当我输入“Geor”或“Pau”时没有结果。

2 个答案:

答案 0 :(得分:1)

我认为你混淆了列名和搜索值。你能试试吗?

SELECT *
FROM employee
WHERE id LIKE CONCAT('%', @search, '%')
   OR firstname LIKE CONCAT('%', @search, '%')
   OR lastname LIKE CONCAT('%', @search, '%')

更新

在您的情况下,LIKE %keyword%REGEXP ('keyword')都会产生相同的结果。我想提供有关TEXT SEARCH的更多信息。

等( '关键字%')

专业人员:很多人都知道,这是通过索引扫描搜索的。所以它很快。 缺点:但是,这不是OP想要的。只搜索前缀匹配。

LIKE( '%关键字%')

专业人士:可以搜索包含“关键字”的任何值,缺点:这很慢。

REXEXP( '关键字')

专业人员:这提供了强大的正则表达式,例如引用Regexp to validate URL in MySQL搜索网址模式。 缺点:这很慢。

FTS(FULLTEXT SEARCH)

专业人员:是的。它超快,缺点:只有MyISAM支持FTS。 (例外,在MySQL 5.6中,InnoDB可以使用FTS。请参考http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html

使用搜索引擎

与Solr,ElasticSearch,Sphinx集成......

专业人士:非常快。 缺点:但很难使用。很少有引用而不是MySQL FTS。有一点延迟可以搜索新插入或更新的值。

我的测试结果

我已经测试过显示每种搜索方法需要多长时间。但搜索引擎尚未经过测试。使用MySQL 5.5,MyISAM(检查FTS)。 search_test中有超过15M的记录。

LIKE'robert%':0.00秒

LIKE'%robert%':9.73秒

REGEXP('robert'):9.16秒

MATCH(值)反对(' robert '在布尔模式中):0.02秒

SELECT SQL_NO_CACHE COUNT(*)
FROM search_test
WHERE value LIKE 'robert%';
+----------+
| COUNT(*) |
+----------+
|     3441 |
+----------+
1 row in set (0.00 sec)

SELECT SQL_NO_CACHE COUNT(*)
FROM search_test
WHERE value LIKE '%robert%';
+----------+
| COUNT(*) |
+----------+
|     5034 |
+----------+
1 row in set (9.73 sec)

SELECT SQL_NO_CACHE COUNT(*)
FROM search_test
WHERE value REGEXP ('robert');
+----------+
| COUNT(*) |
+----------+
|     5034 |
+----------+
1 row in set (9.16 sec)

SELECT SQL_NO_CACHE COUNT(*)
FROM search_test
WHERE MATCH(value)  Against('*robert*' IN BOOLEAN MODE)
+----------+
| COUNT(*) |
+----------+
|     3505 | <= not 5034, maybe stopword matters? I'm not sure. sorry.
+----------+
1 row in set (0.02 sec)

答案 1 :(得分:0)

我找到了答案。我用了REGEXP

WHERE field1 REGEXP(@search)
    OR field2 REGEXP(@search)
    OR field3 REGEXP(@search