php - 如何从大数据库中的文本中检测特定关键字?

标签 php mysql regex

我已经在这个问题上呆了一天了。从PHP+MYSQL角度。但由于数据量太大,我尝试过的大多数脚本都超时了。

所以我们有两个表:

  • 姓名行中的人员 - 大约4000个唯一条目
  • 文本,其中包含消息行 - 大约24 000 个条目

消息有自己的格式,名称被放入 [] 标签中,如下所示:[Jenna]

遗憾的是,并非文本中的所有条目都具有正确的格式。不过,我在人物中确实有很多名字。因此,我想解析 Texts->message 并查看是否有来自 Peoplenames 匹配。当然,我不想匹配 [Somename],因为它已经被标记了。

最终,目标是执行 UPDATE 查询,以便新匹配的消息将使用 [] 标记正确格式化。我不知道这是否可以在同一个 SQL 查询中实现?!

这是一个正则表达式示例,关于我想要检测的内容以及对 preg_match_all() 内部发生的情况的解释:https://regex101.com/r/cQ6gK5/1

这是我尝试过的,因为高级 MySQL 不是我的强项:

<?    
function GetPeople () {
    global $DB;
    $results = $DB->query("SELECT `name` FROM People");
    while ($result = $DB->fetch_array($results)) {
        $return[] = $result['name'];
    }
    return implode('|', $return);
}

$people = GetPeople();

echo '<table><tr><th>Message raw</th><th>Matches</th>';

$results = $DB->query("SELECT `message` FROM Texts WHERE `message` NOT REGEXP '\[(.+?)\]'");
while ($result = $DB->fetch_array($results)) {
    if (preg_match_all('/(?:(?:^|[\s])(' . $people . ')[\s|\n])/i', $result['message'], $matches)) {
        echo '<tr><td>' . $result['message'] . '</td><td><pre>'; print_r($matches); echo '</pre></td></tr>';
    }
}

echo '</table>';

我已经在 MySQL 中索引了名称消息,因为我认为这样可以更容易搜索。我想,所有这一切都可以在没有 php 匹配的情况下完成,只需要单独的 SQL 查询。可悲的是,我永远无法独自完成它应有的优化。非常感谢任何帮助,谢谢。

最佳答案

你可以尝试这样的事情:

SELECT texts.message
FROM texts
JOIN people on texts.message LIKE CONCAT('%', people.name, '%');

这将连接两个表,然后根据“人员”表中的“姓名”列执行类似比较。

关于php - 如何从大数据库中的文本中检测特定关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28182171/

相关文章:

php - 如何防止图像另存为 + 防止图像拖放到桌面 + 防止在桌面浏览器上截图

mysql - SQL - 将特定 ID 列表插入到表中

mysql - 插入时为 "#1242 - Subquery returns more than 1 row"

regex - Python正则表达式匹配除最后一次出现之外的所有内容

php - mysql_real_escape_string 删除变量内容

php - curl 到 cfhttp 翻译

php - 实现异地备份 php/mysql 的最佳方式

mysql - sql查询从两个表中获取数据

regex - 我如何简化这个正则表达式

php - 改进正则表达式以去掉括号内容并换行