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

Php 如何在文本开头找到短语(单词),php,mysql,sql,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 INT

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

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

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');
$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;";
短语文本是一个或多个单词。 表包含大约20000行

现在我从用户请求中获取文本,需要知道该文本是否以任何短语开头。 但我需要找出数据库中最长的短语

我应该将行预缓存到服务器内存中,或者我可以在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"
我觉得这种方式很慢,因为我需要对每个单词进行全表扫描

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

$query = "SELECT SQL_CACHE * FROM phrase WHERE phrase = '{$search}' LIMIT 1";
你可以这样做:

$query = "SELECT SQL_CACHE * FROM phrase WHERE phrase like '%{$search}%' LIMIT 1";
或者,您还可以这样减少代码:

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');
$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;";
$count=count($_请求['text']);
$where=“”;

对于($loop=0;$count,可以使用如下正则表达式:

SELECT * FROM phrase WHERE `text` REGEXP '^(one (two (three)?)?)';
这不需要foreach
循环,因为regexp是贪婪的,并产生尽可能长的匹配。它只使用索引,不进行任何表扫描,因此速度也很快


不过,您必须(一如既往)小心用户输入。

您可以使用索引,这样您就可以避免完整的表扫描,并能够在每次第一次拍摄时访问准确的行

create index btree on test(phrase)

like比phrase='{$search}'@user5332更具CPU和IO的智能性,我认为这是你能得到的最好的解决方案。你也可以使用子字符串,但它的成本要高得多。