如何选择包含用户输入的列?

时间:2015-04-07 13:17:01

标签: mysql sql-like

我想执行MYSQL查询来选择数据库中的标题以某种方式包含用户输入的元素。为了理解我想要的东西:

数据库中的标题可能是

"The three kids are playing in the yard". 

用户可能会搜索“小孩玩”,我希望他找到该标题。目前我正在使用

SELECT title FROM someTable WHERE title LIKE "%sometitle%"`

然而,由于用户输入中缺少单词“are”,因此不会返回标题,因此不会返回任何内容。 当用户没有像标题中那样输入完全相同的单词顺序时,有没有办法选择标题?

2 个答案:

答案 0 :(得分:1)

执行此操作的一种简单方法是将搜索字词拆分为“孩子们”。并且'在玩'并动态生成LIKE语句,如下所示:

SELECT title FROM someTable WHERE title LIKE '%FIRST%SECOND%'

这里FIRST将由孩子取代,而SECOND将被播放取代。所以实际上你会在每个搜索词之间插入一个%。

答案 1 :(得分:0)

或者您也可以使用MySQL full Text search来执行此操作:

Boolean Full Text SearchFull Text Search using Query Expansion

让我们看一下Boolean Full Text Search;

dev.mysql.com上提供的示例表:

mysql> select * from articles;
+----+-----------------------+------------------------------------------+
| id | title                 | body                                     |
+----+-----------------------+------------------------------------------+
|  1 | PostgreSQL Tutorial   | DBMS stands for DataBase ...             |
|  2 | How To Use MySQL Well | After you went through a ...             |
|  3 | Optimizing MySQL      | In this tutorial we will show ...        |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ...      |
|  5 | MySQL vs. YourSQL     | In the following database comparison ... |
|  6 | MySQL Security        | When configured properly, MySQL ...      |
+----+-----------------------+------------------------------------------+

mysql> SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('"database comparison"' IN BOOLEAN MODE);

+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+

当引用单词时,顺序很重要:

mysql> SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('"comparison database"' IN BOOLEAN MODE);

Empty set (0.01 sec)

当我们删除引号时,它会搜索包含“database”或“comparison”字样的行:

mysql> SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('database comparison' IN BOOLEAN MODE);

+----+---------------------+------------------------------------------+
| id | title               | body                                     |
+----+---------------------+------------------------------------------+
|  1 | PostgreSQL Tutorial | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL   | In the following database comparison ... |
+----+---------------------+------------------------------------------+

现在订单无关紧要:

mysql> SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('comparison database' IN BOOLEAN MODE);

+----+---------------------+------------------------------------------+
| id | title               | body                                     |
+----+---------------------+------------------------------------------+
|  1 | PostgreSQL Tutorial | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL   | In the following database comparison ... |
+----+---------------------+------------------------------------------+

如果我们想要获取包含单词“PostgreSQL”或短语“数据库比较”的行,我们应该使用此请求:

mysql> SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('PostgreSQL "database comparison"' IN BOOLEAN MODE);

+----+---------------------+------------------------------------------+
| id | title               | body                                     |
+----+---------------------+------------------------------------------+
|  1 | PostgreSQL Tutorial | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL   | In the following database comparison ... |
+----+---------------------+------------------------------------------+

Fiddle To Try

确保您搜索的字词不在list of stopwords中,但会被忽略。
(显然,像'是',''是stopwords这些词被忽略了)

要在布尔模式下增强结果排序,您可以使用以下查询:

(假设你在用户的输入字符串中总共有两个单词)那么。

SELECT column_names, MATCH (text) AGAINST ('word1 word2')
AS col1 FROM table1
WHERE MATCH (text) AGAINST ('+word1 +word2' in boolean mode) 
order by col1 desc;

(如果用户的输入字符串中有3个单词)那么..

SELECT column_names, MATCH (text) AGAINST ('word1 word2 word3')
AS col1 FROM table1
WHERE MATCH (text) AGAINST ('+word1 +word2 +word3' in boolean mode) 
order by col1 desc;

使用第一个 MATCH() ,我们会在非布尔搜索模式下获得分数(更有特色)第二 MATCH() 可确保我们确实只返回我们想要的结果(包含所有3个字)