grep による全文検索

grep による全文検索
2025/09/26

 FESS などの全文検索エンジンがある一方で、検索なら昔から grep という便利なコマンドがあることが知られています。PDF 文書とか、オフィス系ファイルの中まで検索するのでなければ理論的には grep だけで済みます。grep で一体どのくらいのことができるか、試してみました。


全文検索の概略

 前提として、検索対象をまず *.html(あるいは *.txt) に限定します。 さらに文字コードは UTF-8 にしておく必要があります。 ラーニング・テキスト#2 青空文庫でダウンロードしたテキストの加工1にも書きましたが、これはそう難しいことではありません。 それらが、ホームディレクトリ内の www にあるという前提で、検索してみましょう。

$ grep -nr 日時計 www --include='*.html'

 このようなコードを書けばいいことになります。 結果は 1GB 程度のデータに対し 1秒以内で返ってきます。 データをテキストで貯めているならこれでもう十分実用的といえるでしょう。

WEB インターフェースをつくる

 しかし、毎回、このコマンドを手で打ち、結果をコマンドプロンプトからとってくるのは面倒です。 WEB インターフェースを作りたくなります。 LAN で完結するシステムなので、CGI で十分でしょう。 そういう次第で、Python で書いてみました。 cgi モジュールは Python 3.13 から削除されていますが、 ネット上の信頼できる場所から cgi.py を取ってきて、カレントディレクトリに置けば OK です。

#!/usr/local/bin/python3
import cgi
import io, os
import sys
import subprocess
import re

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

html = '''
<html>
<!DOCTYPE HTML>
<html lang='ja'>
  <head>
    <title>全文検索</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
  </head>
  <body>
<h1>全文検索</h1>
<form method="post" action="" style="text-align:center">
ディレクトリ:<select name='dir'>
{opt}
</select>
語句:<input type='text' name='name' value='{name}'>
<input type='hidden' name='mode' value='confirm'>
<input type='submit' value='検索'>
</form>
検索コマンド:{command}
<hr>
結果:
<pre>
{res}
</pre>
  </body>
</html>
'''

dirs = ['www', 'db']
dirname, name, command, opt, res = '', '', '', '', ''

form = cgi.FieldStorage()
if 'mode' in form:
    dirname = form['dir'].value
    name = form['name'].value

for key in dirs:
    if key == dirname:
        opt += '<option selected>' + key + '</option>\n'
        command = "grep -nr " + name + " " + dirname + " --include='*.txt' --include='*.html'"
        os.chdir('/ホームディレクトリ名')
        res = subprocess.run(command, shell=True ,stdout=subprocess.PIPE , stderr=subprocess.PIPE ,encoding="utf-8").stdout
        res = res.replace('&', '&amp;')
        res = res.replace('<', '&lt;')
        res = res.replace('>', '&gt;')
    else:
        opt += '<option>' + key + '</option>\n'

print(html.format(opt=opt, name=name, command=command, res=res))

 1行目の Python コマンドの位置はご自身の環境に合わせてください。 subprocess モジュールが必要なので、なければ install してください。 また、終わりに近い「ホームディレクトリ名」もご自身のものをお書きください。 総じて、UNIX 環境を前提として書いていますが、Windows, Mac でも動くはずです。

 また、動作には apache などの WWW サーバ、CGI 環境が必要です。 そうした環境がないという場合、参考の「テキストデータ活用術1,2」に方法が書いてあります。

参考:

コメント  記事が気に入ったらいいねしてね! 0  20  

Facebookシェア   
FESS などの全文検索エンジンがある一方で、昔から grep という便利な検索コマンドがあることが知られている。grep だけでどのくらいのことができるだろうか...
『テキストデータ活用術』は今回の第4巻で完結。これを読めば PC を自分の手足のように使える。サンプルコードのおまけつき...
「テキストデータ活用術」シリーズ 1-4 の各章を簡単にご紹介します...
「活用術1」の続編「テキストデータ活用術2: 小説 家庭教師黒木一馬外伝」Kindle 版を出しました。これはその簡単な紹介です...
以前から準備していたテキストデータ書斎術の本を、この度やっと出すことができました。取りあえず、KDP で電子書籍という形で出していますが、しばらくしたら、引き続きペーパーバック版を出します...
.txt, .tex, pdf, Officeファイル, Libre Officeファイル, html ファイルなどを対象にインデックス化され、検索できる Fess のインストールから一般的なカスタマイズまで...
ノートに書いた昔の日記類が大量にあって、読み返してもいなかったんですが、ふと、この際整理し、できればデジタル化しようと思い立ちました...