ColdFusion + Namazu(全文検索)を使ってみた

2012.02.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

今回は全文検索をセットアップしてみました。

ColdFusionに付属するVerityとSolrは使わずにNamazuを使います。

セットアップした環境は以下の通りです。

プロダクト名 バージョン インストールディレクトリ
ColdFusion version 9 C:\ColdFusion9
Windows7 Enterprise Edition
kakasi version 2.3.4 C:\kakasi
Active Perl version 5.8.9 C:\Perl
Namazu version 2.0.21 C:\namazu

まずは検索結果で使うnamazuのテンプレート(NMZ.result.normal.ja)を変更します。この変更は特に強制ではありませんが、自分にあったテンプレートに変更しています。

<dt>${namazu::counter}. <strong><a href="${uri}">${title}</a></strong> (スコア: ${namazu::score})</dt>
<dd>${summary}</dd>
<dd><a href="${uri}">${uri}</a> (${size} bytes)<br><br></dd>

次に検索結果で使うnamazuのテンプレート(NMZ.head.ja)を変更します。<head>の下に以下の一行を追加しました。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=Shift-JIS"> ←追加した行
<!-- LINK-REV-MADE -->
<title>Namazu: a Full-Text Search Engine</title>
    ・
    ・
    ・

次に検索結果で使うnamazuのテンプレート(NMZ.foot.ja)を変更します。</body>の上に一行を追加しました。

<dd><a href="../search.html">検索へ戻る</a></dd> ←追加した行
</body>
</html>

今回作ったアプリケーションはOfficeファイルをアップロードし、アップロードされたファイルをPDFに変換、更にPDFからTEXTだけを抽出して、そのTEXTファイルにてNamazuのインデックスファイルを作成する。という流れのWebアプリケーションを作っていますが、その一部のNamazuの部分だけを抜き出して記事にしています。

キーワード入力用のサンプルhtml(namazu.html)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang=ja>
    <head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
		<meta http-equiv="Content-Script-Type" content="text/javascript">
    </head>
    <body>
	<form action="search_document.cfm" name="form1" method="post">
	全文検索ワード<input type="text" name="keywordinput">
	<input type="submit">
	</form> 
    </body>
</html>

アクションページ側のサンプルcfml(search_document.cfm)IPアドレス(xxx.xxx.xxx.xxx)は適宜読み替えてください。

<html>
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=utf-8">
		<title>Galleriffic | Thumbnail rollover effects and slideshow crossfades</title>
		<link rel="stylesheet" href="css/basic.css" type="text/css" />
	</head>
	<body>


	<cfset dic ="C:\namazu\var\namazu\index\cm">
	<cfset out_file = "c:\temp\sample_result.html">
	<cfset opt ="-h -U -o " & #out_file#>

	<cfif not IsDefined("form.keywordinput")>
		<cflocation url="http://xxx.xxx.xxx.xxx/sample/namazu.html">
	</cfif>

	<!--- 検索コマンド発行 --->
	<cfexecute name="C:\namazu\bin\namazu.exe" arguments="#opt# #form.keywordinput# #dic#"></cfexecute>

	<!--- 処理が早すぎてNamazu検索結果ファイル生成前にコマンドが発行されるので、スリープを150msで設定する --->
	<cfset thread = CreateObject("java", "java.lang.Thread") />
	<cfset thread.sleep(150) />

	<!--- 吐き出されたHTMLを加工する --->
	<cffile action="read" file="#out_file#" charset="shift_jis" variable="result_contents">

	<!--- Namazuで吐き出された検索結果リストのURLをhttp://に置き換える --->
	<cfset trance_result = replace("#result_contents#","/C|/inetpub/wwwroot/sample/text","http://xxx.xxx.xxx.xxx/sample/upload","All")>
	
	<!--- 拡張子txtをpdfに置き換える --->
	<cfset trance_result2 = replace("#trance_result#",".txt",".pdf","All")>

	<cffile action = "write" attributes="normal" file ="C:\inetpub\wwwroot\sample\temp\sample_result.html" output ="#trance_result2#" charset="shift_jis">

	<cflocation url="http://xxx.xxx.xxx.xxx/sample/temp/sample_result.html">

	</body>
</html>

※mknmzrcの $MAX_FIELD_LENGTH の値を200から1024に設定変更しています。($MAX_FIELD_LENGTH = 1024;)

実行画面のスクリーンショット(キーワードを『検証』として検索)