Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 根据DB检查段落中的单词的有效方法是什么?_Php_Mysql - Fatal编程技术网

Php 根据DB检查段落中的单词的有效方法是什么?

Php 根据DB检查段落中的单词的有效方法是什么?,php,mysql,Php,Mysql,我有一个叫做关键字的表。它很简单,有两列-id和keyword。这个表一直在增长,我们一直在向它添加额外的内容 现在,我们有一个用户提交了2-3句话的段落。我们想对照关键字表中的所有关键字检查本段中的单词 最有效的方法是什么?我最初的逻辑如下 // explode $paragraph into $words[] // cycle through $words -- in each loops, SQL statement where $word = keyword // output an

我有一个叫做关键字的表。它很简单,有两列-id和keyword。这个表一直在增长,我们一直在向它添加额外的内容

现在,我们有一个用户提交了2-3句话的段落。我们想对照关键字表中的所有关键字检查本段中的单词

最有效的方法是什么?我最初的逻辑如下

// explode $paragraph into $words[]

// cycle through $words -- in each loops, SQL statement where $word = keyword

// output any matched keywords
这是最有效的吗?请记住,关键字表可以有几千行。我应该使用Sphinx搜索解决方案吗

将用户输入分解为文字。 查询:

必须插入尚未返回的单词

将检索到的ID与新插入的ID合并可以得到一整套已使用的ID。 将用户输入分解为文字。 查询:

必须插入尚未返回的单词

将检索到的ID与新插入的ID合并可以得到一整套已使用的ID。
我认为这是正确的方法。但我更喜欢第二个小得多的表格,上面有你在段落中经常使用的排除词,例如“and”、“or”、“the”等等。。。。从$words中删除所有这些单词,可以节省一些毫秒。

我认为这是正确的方法。但我更喜欢第二个小得多的表格,上面有你在段落中经常使用的排除词,例如“and”、“or”、“the”等等。。。。从$words中删除所有这些单词,可以节省一些毫秒。

这是使用存储过程的绝佳机会。Crozin的回答会起作用,但我更喜欢将这种逻辑保存在数据库中

原因:

如果您决定在以后添加/删除/重命名列,或者如果您有幸在项目中拥有DBA,这将使维护变得更加容易

如果您是从用户输入生成单词列表,它将有助于防止SQL注入。我将我站点的db用户帐户的权限限制为执行存储过程的能力

无论哪种情况,逻辑都是一样的。将段落转换为单词,并使用中的将关键字列与该列表进行比较

或者,如果您处理的是大量文本,则将生成的单词列表拆分并透视成行(可能是在临时表中)并从联接中选择可能更有效:

select *
from keywords
join #paragraph_words
on keywords.keyword=#paragraph_words.keyword;
您必须检查语法,因为我现在没有时间验证它


类似于中的set运算符的性能可能不如join,不过,正如我所说的,如果您只处理一个简短的单词列表,那么这就太过了。

这是使用存储过程的绝佳机会。Crozin的回答会起作用,但我更喜欢将这种逻辑保存在数据库中

原因:

如果您决定在以后添加/删除/重命名列,或者如果您有幸在项目中拥有DBA,这将使维护变得更加容易

如果您是从用户输入生成单词列表,它将有助于防止SQL注入。我将我站点的db用户帐户的权限限制为执行存储过程的能力

无论哪种情况,逻辑都是一样的。将段落转换为单词,并使用中的将关键字列与该列表进行比较

或者,如果您处理的是大量文本,则将生成的单词列表拆分并透视成行(可能是在临时表中)并从联接中选择可能更有效:

select *
from keywords
join #paragraph_words
on keywords.keyword=#paragraph_words.keyword;
您必须检查语法,因为我现在没有时间验证它


像IN这样的set操作符的性能可能不如join那么好,不过,正如我所说的,如果您只处理一个简短的单词列表,这将是一种过分的操作。

多次查询数据库将不是最有效的方法

我想您可以使用MySQL功能来解决您的问题。它不会在高负载下扩展,但对于大多数站点来说,它可以快速完成工作


如果你想要最优化的解决方案,你应该学习elasticsearch、solr、sphinx、lucene等产品,因为它们是为了解决这个问题而编写的。

多次查询数据库并不是最有效的方法

我想您可以使用MySQL功能来解决您的问题。它不会在高负载下扩展,但对于大多数站点来说,它可以快速完成工作


如果你想要最优化的解决方案,你应该学习elasticsearch、solr、sphinx、lucene等产品,因为它们是为了解决这个问题而写的。

有一系列排除的单词。或者从数据库中提取,或者别的什么

$excludeThis = array(
  'a',
  'the',
  'for',
);
去掉所有的点、斜线等

$text = preg_replace('/[^A-Za-z0-9]/', ' ', $text);
$text = str_replace('  ', ' ', $text);
分解文本

$words = explode(' ', $text);
构建一个数组,其中包含所有要与关键字匹配的单词

$array = array();
if ( ! empty($words)) {
  foreach ($words as $word) {
    if (in_array(strtolower(trim($word)), $excludeThis))
      continue;

    $array[] = strtolower(trim($word));
  }
}
从数据库中提取你的关键字,你可能真的想缓存这个。。。只需使用来匹配两个数组


不知道这是否是最快的方法,但可能会有所帮助。

有一系列排除的wo rds。或者从数据库中提取,或者别的什么

$excludeThis = array(
  'a',
  'the',
  'for',
);
去掉所有的点、斜线等

$text = preg_replace('/[^A-Za-z0-9]/', ' ', $text);
$text = str_replace('  ', ' ', $text);
分解文本

$words = explode(' ', $text);
构建一个数组,其中包含所有要与关键字匹配的单词

$array = array();
if ( ! empty($words)) {
  foreach ($words as $word) {
    if (in_array(strtolower(trim($word)), $excludeThis))
      continue;

    $array[] = strtolower(trim($word));
  }
}
从数据库中提取你的关键字,你可能真的想缓存这个。。。只需使用来匹配两个数组


不知道这是否是最快的方法,但可能会有所帮助。

您希望段落中的关键字与数据库中的关键字100%匹配吗?不区分大小写是否是一个问题?您希望段落中的关键字与数据库中的关键字100%匹配?不区分大小写是一个问题吗?我同意,用在单词列表中。你也可以先过滤掉停止词a、the、and、or等,以减少搜索数组的大小。小技巧:最好避免使用像tbl_u这样的表前缀,因为在其他数据库(如MSSQL)中强烈反对使用它们。如果应用程序将来需要扩展到性能更高的数据库,这可能会困扰您。db_name、tbl_name、col_name-当您不知道实际的数据库模式时,这些是常用的名称:例如:从tbl_name中选择col_name,其中col_name*54-5=col2_name;举个例子就可以了;我只是在实际实现中尽量避免使用它。在实际代码的上下文中,这些前缀是不必要的。我同意,在单词列表中使用。你也可以先过滤掉停止词a、the、and、or等,以减少搜索数组的大小。小技巧:最好避免使用像tbl_u这样的表前缀,因为在其他数据库(如MSSQL)中强烈反对使用它们。如果应用程序将来需要扩展到性能更高的数据库,这可能会困扰您。db_name、tbl_name、col_name-当您不知道实际的数据库模式时,这些是常用的名称:例如:从tbl_name中选择col_name,其中col_name*54-5=col2_name;举个例子就可以了;我只是在实际实现中尽量避免使用它。在实际代码的上下文中,这些前缀是不必要的。