如何在文本开头找到短语(单词)
我需要非常快速的解决方案,以确定文本是否开始了一些已知的短语
我在Mysql(innodb)表中有这样的短语:
CREATE TABLE IF NOT EXISTS `phrase` (
`id` int(10) unsigned NOT NULL,
`text` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `text` (`text`)
) ENGINE=InnoDB;
INSERT INTO phrase VALUES (1, 'one');
INSERT INTO phrase VALUES (2, 'one two');
INSERT INTO phrase VALUES (3, 'two');
INSERT INTO phrase VALUES (4, 'three');
短语文本是单个或多个单词。 表包含大约20.000行
现在我从用户请求中获取文本,并且需要知道此文本是否像任何短语一样开始。 但我需要找出数据库中最长的短语
我应该将行预先缓存到服务器内存,或者我可以在mysql表中搜索。
我试过这个
$_REQUEST['text'] = 'one two three';
$_REQUEST['text'] = explode(' ', $_REQUEST['text']);
$search = ''; $found = null;
foreach ($_REQUEST['text'] as $next_word) {
$search .= (($search == '') ? '' : ' ').$next_word;
$query = "SELECT SQL_CACHE * FROM phrase WHERE phrase = '{$search}' LIMIT 1;";
...
$row = mysql_fetch_assoc($result);
if ( ... not found ... ) break;
else $found = $row;
}
print_r($row); // print latest found phrase "one two"
我觉得这种方式很慢,因为我需要为每个词进行全表扫描
您知道更快的解决方案吗?
答案 0 :(得分:1)
而不是
$query = "SELECT SQL_CACHE * FROM phrase WHERE phrase = '{$search}' LIMIT 1";
你可以这样做:
$query = "SELECT SQL_CACHE * FROM phrase WHERE phrase like '%{$search}%' LIMIT 1";
或者你可以减少你这样的代码:
$count = count($_REQUEST['text']);
$where = "";
for($loop=0;$count<$loop;$loop++) {
if($loop!=($count-1))
$where .= "phrase like '%".$_REQUEST['text'][$loop]."%' OR";
else
$where .= "phrase like '%".$_REQUEST['text'][$loop]."%'";
}
$query = "SELECT SQL_CACHE * FROM phrase WHERE $where LIMIT 1;";
答案 1 :(得分:0)
你可以像这样使用正则表达式:
SELECT * FROM phrase WHERE `text` REGEXP '^(one (two (three)?)?)';
这没有foreach
循环,因为正则表达式是贪婪的并且可以产生最长的匹配。它仅使用索引,不进行任何表扫描,因此速度也很快。
你必须小心使用用户输入(一如既往)。
答案 2 :(得分:0)
您可以使用索引,这样您就可以避免全表扫描,并且每次都可以在第一次拍摄时访问确切的行。
create index btree on test(phrase)