Raspberry OSで全文検索のソリューションを導入したいと思いいくつか試してみました。残念ながらArm系のプロセッサが対応していなかったり、起動出来たソリューションでもRasberry Piの性能不足で実用的なパフォーマンスが担保できませんでした。
とりあえず静的なhtmlの文字が検索出来れば良いので、PHPのglob()でファイル検索をして拡張子がhtmlのファイルの中身をpreg_grep()で文字マッチングするスクリプトを作成してみたいと思います。
とりあえず静的なhtmlの文字が検索出来れば良いので、PHPのglob()でファイル検索をして拡張子がhtmlのファイルの中身をpreg_grep()で文字マッチングするスクリプトを作成してみたいと思います。
<?php
function my_search($file, $search_word)
{
$contents = file_get_contents($file);
$charset = mb_detect_encoding($contents, "sjis-win, JIS, eucjp-win, utf-8");
if (mb_strtolower($charset) != "utf-8")
{
$contents = mb_convert_encoding($contents, "utf-8", $charset);
}
$lines = preg_split("/\r\n|\r|\n/", $contents);
$lines_count = count($lines);
$result = array();
for($i = 0; $i < $lines_count; $i++)
{
if (preg_match("/".$search_word."/", $lines[$i]))
{
$result[] = array($i, $lines[$i]);
}
}
return $result;
}
function get_filelist($dir) {
$files = glob(rtrim($dir, '/') . '/*');
$list = array();
foreach ($files as $file) {
if (is_file($file)) {
$list[] = $file;
}
if (is_dir($file)) {
$list = array_merge($list, get_filelist($file));
}
}
return $list;
}
#$file = '/var/www/html/webarc/20220610/www3.kiwi-us.com/‾tomoyaz/higa0001.html';
#var_dump(my_search($file, "DOS"));
$search_result = array();
$search_dir = "/var/www/html/webarc/";
$url_base = "http://pi3/webarc/";
if (array_key_exists("search_word", $_POST))
{
$files = get_filelist($search_dir);
foreach($files as $file)
{
if (preg_match("/html$/", $file))
{
$matches = my_search($file, $_POST["search_word"]);
foreach($matches as $match)
{
$search_result[] = array($file, $match[0], $match[1]);
}
}
}
#var_dump($search_result);
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>簡易テキストサーチ</title>
</head>
<body>
<form method="post">
<input type="text" name="search_word">
<button type="submit">検索</button>
</form>
<hr>
<?php
foreach($search_result as $a)
{
$url = str_replace($search_dir, $url_base, $a[0]);
$content = htmlentities($a[2], ENT_QUOTES, 'UTF-8');
$html = "<div>"."<span><a href=\"".$url."\">".$url."</a></span>"." <span>".$a[1]."行目</span> "."<br><span>抜粋:".$content."</span>"."</div>\n";
echo($html);
}
?>
</body>
</html>
ファイル数に比例して検索速度が低下するので、WEBアプリケーションとしては問題ですが、プライベートなWEBサーバーで動かす分には誰の迷惑にもならないので良しとします。
コメント