需求
字段content 存了一个路径 我们假设为
C:\PerfLogs\a.txt
我们称之为一个内容
n个字段就对应n个内容
内容内的文本 文本就是a.txt 里面的内容
我们想通过搜索某个值 判断a.txt里面存在不存在这个值
n个内容内的文本如何搜索出来呢 sql 有没有直接的方法呢
貌似没有 或者说只是我还不知道....
鱼似乎 我就想起来另一种解决方案 先遍历本地所有数据 存到一个文件上 然后查这个文件
遍历本地所有数据 存到一个文件上 这一步骤不是每次都要写的
$file = "static/file/text/search_cache_text.txt";
if (!file_exists($file)) {
read_all($_SERVER['DOCUMENT_ROOT'] . '/static/file/text/2018', $allContent);
if (!file_put_contents($file, $allContent)) {
die("文件写入失败");
}
} else {
$allContent = file_get_contents($file);
$res = explode("#end#\n", $allContent);
foreach ($res as $value) {
if (strstr($value, $search)) {
$dataA = explode('#splite#', $value);
$currentData = $dataA[0];
$needStr .= " `pay_dir` LIKE '%" . $currentData . "' OR";
}
}
if (empty($needStr)) {
recordSearchEmpty($login, $user, $search);
} else {
$needStr = substr($needStr, 0, -2) . " AND ";
}
}
//读取该目录下所有内容
function read_all($dir, &$allContent)
{
if (!is_dir($dir)) return false;
$handle = opendir($dir);
if ($handle) {
while (($fl = readdir($handle)) !== false) {
$temp = $dir . DIRECTORY_SEPARATOR . $fl;
//如果不加 $fl!='.' && $fl != '..' 则会造成把$dir的父级目录也读取出来
if (is_dir($temp) && $fl != '.' && $fl != '..') {
read_all($temp, $allContent);
} else {
if ($fl != '.' && $fl != '..') {
$date = explode('\\', $temp);
$allContent .= $date[count($date) - 1] . "#splite#" . file_get_contents($temp) . "#end#\n";
}
}
}
}
}
这样 我们只需要在sql 前面拼接这个 needStr 就阔以了 是不是聪明的一笔
大文件放在数据库有点少钱
放在本地有点不好查询 所以出此下策 以供参考
插入或者删除这些数据的时候可以加上
$cachefile = "static/file/text/search_cache_text.txt";
if (file_exists($cachefile)) {
unlink($cachefile);
}
以便于下次生成
或者插入 再put一次内容 删除 找指定的字段删掉
其实sql核心就是增删改查 所以 做什么步骤都要考虑这一点~~