如何在文本开头找到短语(单词)

时间:2014-01-17 11:12:51

标签: php mysql sql

如何在文本开头找到短语(单词)

我需要非常快速的解决方案,以确定文本是否开始了一些已知的短语

我在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"

我觉得这种方式很慢,因为我需要为每个词进行全表扫描

您知道更快的解决方案吗?

3 个答案:

答案 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)