制作一个过滤MySQL列中单词的php查询

时间:2011-06-30 16:36:20

标签: php mysql

我是php和mySQL的新手,所以请原谅我,如果这是一个简单或常见的问题,但我看了一遍,找不到答案。

基本上,我正在建立一个快速搜索房地产页面,有人可以输入地址,搜索结果会显示出来(如果他们输入广泛的类似“90th street”的话,也会有相似的结果)

现在我的查询看起来像这样。 ($ QuickSearch是他们输入的值。)

$query   =  "SELECT * FROM MLSSales WHERE (ID = '$QuickSearch') or (concat_ws(' ',StreetNum, StreetName) like '%$QuickSearch%');

现在这个搜索适合我,但问题是StreetName列中的某些列表包含“West”或“East”等字样。如果有人搜索“West 90th Street”,“300 West 90th Street”,“300 West 90th”等内容。我的搜索工作。但如果他们输入类似“300 90th Street”的内容,我就不会得到结果。

如何使搜索稍微宽松一点而不会使其变得如此宽松,以至于会导致不良结果。

2 个答案:

答案 0 :(得分:0)

您需要的是全文搜索,或操纵搜索文本以使其更加通配。

您的查询归结为

... like '%300 90th Street'

只有当这3个单词彼此完全相邻且它们之间只有一个空格时才有效。

全文搜索会将其视为

... like '%300%' or like '%90th%' or like '%Street%'

(作为一个非常hacky的例子)。如果您不能在此表上使用FULLTEXT索引,那么您可以尝试自己进行一些预处理,将搜索短语中的每个单词转换为自己的“like”子句。性能会很糟糕,因为`%...%'子句不能使用索引,但允许任意匹配。

答案 1 :(得分:0)

我强烈反对使用“WHERE column1 LIKE'%blah%'”表达式编写自己的全文搜索引擎。你会遇到各种问题,包括词干,拼写错误等。

MySQL已有一个。它是使用MATCH()语法的那个。看起来你只想要精确匹配。 MySQL支持 - 您可以过滤掉匹配分数较低的记录。有关详细信息,请参阅手册的此页面:http://dev.mysql.com/doc/refman/5.5/en/fulltext-natural-language.html

示例:

CREATE TABLE articles (
    ->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->   title VARCHAR(200),
    ->   body TEXT,
    ->   FULLTEXT (title,body)
    -> ) ENGINE=MyISAM;

mysql> INSERT INTO articles (title,body) VALUES
    -> ('MySQL Tutorial','DBMS stands for DataBase ...'),
    -> ('How To Use MySQL Well','After you went through a ...'),
    -> ('Optimizing MySQL','In this tutorial we will show ...'),
    -> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
    -> ('MySQL vs. YourSQL','In the following database comparison ...'),
    -> ('MySQL Security','When configured properly, MySQL ...');

mysql> SELECT id, body, MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root'
    -> IN NATURAL LANGUAGE MODE) AS score
    -> FROM articles WHERE MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root'
    -> IN NATURAL LANGUAGE MODE);
+----+-------------------------------------+-----------------+
| id | body                                | score           |
+----+-------------------------------------+-----------------+
|  4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
|  6 | When configured properly, MySQL ... | 1.3114095926285 |
+----+-------------------------------------+-----------------+