php - 从数据库中查找文本中的多个单词
php - Find multiple words in text from database
我有一个来自 Android 系统的字符串。
我收到该字符串,对应于 php 文件中的地址,并想检查该地址是否与我的数据库中的地址匹配。
但是,我希望无论用户输入单词的顺序如何,它都能工作。
起初,我使用 LIKE 如下:
$address=preg_replace('#\s+#','%',$_POST['address']);
$address='%'.$address.'%';
echo $address;
$list_business = $bdd->prepare('SELECT * FROM business WHERE address LIKE ? OR name_business LIKE ?');
$list_business->execute(array($address,$address));
这实际上让我即使省略了一些单词也能得到结果。
例如,443 Street 将匹配 443 First Street。
但是如果用户输入 id 作为 First Street 443,它不会 return 任何东西。
我在考虑正则表达式,但它真的适用于这种问题吗?或者我应该为每个单词使用一种不同的正则表达式?
您可能想看看第三方搜索引擎,它们可以很容易地为您完成这项工作。
按顺序查看 SOLR、ElasticSearch 和 Sphinx。
您或许可以使用 Mysql 的全文搜索来做到这一点,但上面的搜索引擎可以做得更好。
这是一个使用 MySQL 的内置全文搜索的演示
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| sample |
+----------------+
1 row in set (0.00 sec)
mysql> show create table test.sample;
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sample | CREATE TABLE `sample` (
`id` int(11) NOT NULL,
`address` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `ftext` (`address`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from test.sample;
+----+-----------------------------------------+
| id | address |
+----+-----------------------------------------+
| 1 | 345 Park Avenue New York, NY 10154-0102 |
| 2 | 610 Waring Ave Bronx, New York NY 10467 |
+----+-----------------------------------------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM test.sample
-> WHERE match(`address`)
-> against('+new +york +ave' IN BOOLEAN MODE);
+----+-----------------------------------------+
| id | address |
+----+-----------------------------------------+
| 1 | 345 Park Avenue New York, NY 10154-0102 |
| 2 | 610 Waring Ave Bronx, New York NY 10467 |
+----+-----------------------------------------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM test.sample
-> WHERE match(`address`)
-> against('+ny +park' IN BOOLEAN MODE);
+----+-----------------------------------------+
| id | address |
+----+-----------------------------------------+
| 1 | 345 Park Avenue New York, NY 10154-0102 |
+----+-----------------------------------------+
1 row in set (0.00 sec)
mysql>
我有一个来自 Android 系统的字符串。 我收到该字符串,对应于 php 文件中的地址,并想检查该地址是否与我的数据库中的地址匹配。 但是,我希望无论用户输入单词的顺序如何,它都能工作。
起初,我使用 LIKE 如下:
$address=preg_replace('#\s+#','%',$_POST['address']);
$address='%'.$address.'%';
echo $address;
$list_business = $bdd->prepare('SELECT * FROM business WHERE address LIKE ? OR name_business LIKE ?');
$list_business->execute(array($address,$address));
这实际上让我即使省略了一些单词也能得到结果。 例如,443 Street 将匹配 443 First Street。 但是如果用户输入 id 作为 First Street 443,它不会 return 任何东西。 我在考虑正则表达式,但它真的适用于这种问题吗?或者我应该为每个单词使用一种不同的正则表达式?
您可能想看看第三方搜索引擎,它们可以很容易地为您完成这项工作。
按顺序查看 SOLR、ElasticSearch 和 Sphinx。
您或许可以使用 Mysql 的全文搜索来做到这一点,但上面的搜索引擎可以做得更好。
这是一个使用 MySQL 的内置全文搜索的演示
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| sample |
+----------------+
1 row in set (0.00 sec)
mysql> show create table test.sample;
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sample | CREATE TABLE `sample` (
`id` int(11) NOT NULL,
`address` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `ftext` (`address`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from test.sample;
+----+-----------------------------------------+
| id | address |
+----+-----------------------------------------+
| 1 | 345 Park Avenue New York, NY 10154-0102 |
| 2 | 610 Waring Ave Bronx, New York NY 10467 |
+----+-----------------------------------------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM test.sample
-> WHERE match(`address`)
-> against('+new +york +ave' IN BOOLEAN MODE);
+----+-----------------------------------------+
| id | address |
+----+-----------------------------------------+
| 1 | 345 Park Avenue New York, NY 10154-0102 |
| 2 | 610 Waring Ave Bronx, New York NY 10467 |
+----+-----------------------------------------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM test.sample
-> WHERE match(`address`)
-> against('+ny +park' IN BOOLEAN MODE);
+----+-----------------------------------------+
| id | address |
+----+-----------------------------------------+
| 1 | 345 Park Avenue New York, NY 10154-0102 |
+----+-----------------------------------------+
1 row in set (0.00 sec)
mysql>