|Fess| で作るApache Solrベースの検索サーバー 〜 導入編
管理するドキュメントは日々増えていき、それらのドキュメントを効率よく管理することを求められています。 管理対象ドキュメントが多くなればなるほど、その中から特定の情報をもつものを見つけにくくなっていきます。 その解決策として、膨大な情報から検索することができる全文検索サーバーを導入することなどがあげられます。
|Fess| は簡単に導入できる、Java ベースのオープンソース全文検索サーバーです。 |Fess| の検索エンジン部分には Apache Solr を利用しています。 Solr は、2 億ドキュメントもインデックス可能と言われる非常に高機能な検索エンジンです。 一方で、 Apache Solr で検索システムを構築しようとする場合、クローラ部分などを自分で実装する必要性があります。 |Fess| ではクローラ部分に Seasar Project から提供される S2Robot を利用して、ウェブやファイルシステム上の様々な種類のドキュメントを収集して検索対象とすることができます。
そこで、本記事では |Fess| による検索サーバーの構築について紹介します。
- 検索システムを構築してみたい方
- 既存のシステムに検索機能を追加してみたい方
- Apache Solr に興味がある方
この記事の内容に関しては次の環境で、動作確認を行っています。
- Windows 7 (Service Pack1)
- JDK 1.7.0_21
|Fess| とは
|Fess| はウェブやファイルシステムを対象とした、オープンソースの全文検索システムです。 SourceForge.jp の Fess サイトから Apache ライセンスで提供されています。
|Fess| の特徴
|Fess| は以下の図にあるとおり、様々なオープンソースプロダクトを利用して構築されています。
|Fess| の構造
配布物は Tomcat に |Fess| と Solr の war ファイルが配備された形になります。 |Fess| の war ファイルは検索画面や管理画面を提供しています。 |Fess| は開発フレームワークとして Seasar2 を利用し、プレゼンテーション層には SAStruts を採用しています。 ですので、画面などのカスタマイズが必要な場合は JSP を修正することで簡単にカスタマイズが可能です。
また、設定データやクロールデータを保存するために組み込みデータベースの H2Database を利用し、O/R マッパーの DBFlute を利用してアクセスしています。 S2Chronos は Seasar プロジェクトで提供されるスケジューリングフレームワークで、 |Fess| では指定された時間でのクロールを実行するために利用しています。 Solr と S2Robot については後述します。
|Fess| は Java ベースのシステムとして構築されているので、どのプラットフォームでも実行可能です。 各種設定もウェブブラウザから簡単に設定する UI を備えています。
Apache Solr は Apache Software Foundation から提供される、Lucene をベースとしたエンタープライズ向け検索サーバーです。 特徴としては、ファセット検索、検索結果の強調表示、複数の出力形式などをサポートしていることが上げられます。 また、検索対象とすることができるドキュメント数は、Solr サーバーの構成次第で、数億ドキュメントにもなり、大規模サイトへもスケールアウトできる検索サーバーです。 利用実績も日本でも数多くあり、注目されている検索エンジンの一つであると言えます。
|Fess| では、検索エンジン部分に Apache Solr を採用しています。 |Fess| の配布物には Solr を同梱した形で配布していますが、 |Fess| の Solr サーバーを別なサーバーへ切り出して利用することも可能です。 また、 |Fess| は複数の Solr サーバーをグループとして管理して、冗長構成を組むことが可能です。 このように |Fess| では Solr のもつ高い拡張性を活かすことができる設計になっています。
S2Robot は Seasar プロジェクトから提供される、クローラフレームワークです。 S2Robot はウェブ上にあるドキュメントやファイルシステム上にドキュメントを巡回して収集することができます。 ドキュメント収集もマルチスレッドで同時に複数のドキュメントを効率良く処理することが可能です。 また、扱えるドキュメントは HTML はもちろんのこと、Word や Excel などの MS Office 系ファイル、zip などのアーカイブファイル、画像や音声ファイルなど、数多くのフォーマットに対応しています(画像や音声ファイルの場合はメタ情報を取得します)。
|Fess| では S2Robot を利用して、ウェブ上およびファイルシステム上のドキュメントを巡回して、テキスト情報を収集します。 対応するファイルフォーマットも S2Robot が扱うことができるものを検索対象とすることができます。 S2Robot でクロール実行するためのパラメータ等は |Fess| の管理 UI から設定することが可能です。
|Fess| は docomo、au、ソフトバンクの携帯電話端末での閲覧にも対応しています。 ドキュメントをインデックスする際にどの端末で検索結果を閲覧可能にするかを指定することができます。 本稿ではモバイル端末での閲覧については省略し、次回説明します。
ここでは、 |Fess| を起動させ、検索を行うまでの手順を説明します。 Windows XP で実行することを想定して説明を行いますが、Mac OS X や Linux でもほぼ同様の手順でインストールと起動を行うことができます。
http://sourceforge.jp/projects/fess/releases/ から最新のパッケージをダウンロードします。 この記事執筆の時点(2013/06)での最新バージョンは、 8.1.0 です。 ダウンロード完了後、任意のディレクトリに解凍してください。
|Fess| のダウンロード
CATALINA_HOME と JAVA_HOME を環境にあわせ適切に設定し、%CATALINA_HOME%\bin\startup.bat を実行してください。 たとえば、C:\fess に fess-8.1.0.zip を解凍した場合、CATALINA_HOME は、C:\fess\fess-server-8.1.0 になります。
|Fess| の起動
C:\fess\fess-server-8.1.0>set "JAVA_HOME=C:\Program Files\Java\jdk1.7.0_21" C:\fess\fess-server-8.1.0>set CATALINA_HOME=C:\fess\fess-server-8.1.0 C:\fess\fess-server-8.1.0>cd bin C:\fess\fess-server-8.1.0\bin>startup.bat
ブラウザで http://localhost:8080/fess/ にアクセスし、以下のような画面が表示されれば、 |Fess| は起動しています。
shutdown.bat を実行してください。
|Fess| の停止
C:\fess\fess-server-8.1.0\bin>shutdown.bat
ディレクトリ構成は以下のようになります。
ディレクトリ構成
fess-server-8.1.0/ |-- LICENSE |-- NOTICE |-- RELEASE-NOTES |-- RUNNING.txt |-- bin/ |-- conf/ |-- extension/ |-- lib/ |-- logs/ |-- solr/ -- | |-- contrib/ | |-- core1/ | | |-- bin/ -- | | |-- conf/ -- | | |-- data/ -- | | `-- txlog/ | |-- dist/ | `-- lib/ |-- temp/ |-- webapps/ | |-- fess/ | | |-- META-INF/ | | |-- WEB-INF/ | | | |-- cachedirs/ -- | | | |-- classes/ -- | | | |-- db/ -- | | | |-- cmd/ | | | |-- conf/ | | | |-- lib/ | | | |-- orig/ | | | |-- logs/ -- | | | |-- view/ -- | | | |-- fe.tld | | | |-- struts-config.xml | | | |-- validator-rules.xml | | | `-- web.xml | | |-- css/ -- | | |-- js/ -- | | |-- images/ -- | | `-- jar/ | |-- fess.war | |-- solr/ -- | |-- solr.war | |-- manager/ | `-- manager.war `-- work/
「fess-server-8.1.0」直下のディレクトリ構成は Tomcat 7 とほぼ同様で、Solr のデータディレクトリ「solr」、「fess.war」と「solr.war」が配備された形になります。 配備された「fess.war」は「webapps/fess/WEB-INF/view」に検索画面や管理画面の JSP ファイルが配置されています。 また、利用している CSS ファイルは「webapps/fess/css」に配置しているので、画面のカスタマイズが必要な場合はそれらのファイルを編集します。
起動直後の状態では、検索するためのインデックスが作成されていないため、検索しても何も結果が返ってきません。 ですので、まずインデックスを作成する必要があります。 ここでは、 https://fess.codelibs.org/ja/ 以下を対象にインデックスを作成し、検索を行うまでを例として説明します。
まず、管理ページである http://localhost:8080/fess/admin にアクセスし、ログインしてください。 デフォルトではユーザー名、パスワードともに admin です。
次に、クロールの対象を登録します。 今回は、 Web ページを対象とするので、管理ページの左側から[ウェブ]を選択してください。 初期状態では何も登録されていないため、[新規作成]を選択します。
ウェブクロールの設定として、今回は、https://fess.codelibs.org/ja/ 以下のすべてのページをクロール対象とすることにします。 また、ブラウザタイプとしてもすべてを選択し、PC や携帯電話のどのような環境から検索をしても結果が表示されるようにします。
その後、確認画面で[作成]をクリックすることで、クロールの対象を登録することができます。 登録内容は、[編集]から変更することが可能です。
次に、ドキュメントを巡回して収集するクロールスケジュールを設定します。 クロールのスケジュールは管理ページの左側のメニューの[クロール全般]から設定します。
設定の書式は、Unix の Cron に似ています。左から、秒、分、時、日、月、曜日 を表します。 たとえば、毎日 12:10am にクロールを行わせたい場合、「0 10 12 * * ?」 とします。
クロールが開始され、インデックスが作成されているかどうかは、左側のメニューの[セッション情報]から確認することができます。 クロールが完了している場合、[セッション情報] の インデックスサイズ(ウェブ/ファイル) に検索対象としたドキュメント数が表示されます。
クロール完了後、検索をすると下の画像のような結果が返されます。
ここでは、利用者が最も閲覧する、検索トップ画面と検索結果一覧画面をカスタマイズする方法を紹介します。
今回は、ロゴファイル名を変える方法を示します。 デザイン自体を変えたい場合については、シンプルな JSP ファイルで記述されているので HTML の知識があれば変更することができます。
まず、検索トップ画面は「webapps/fess/WEB-INF/view/index.jsp」ファイルになります。
検索トップ画面のJSPファイル
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="content-style-type" content="text/css" /> <meta http-equiv="content-script-type" content="text/javascript" /> <title> |Fess| </title> <link href="${f:url('/css/style.css')}" rel="stylesheet" type="text/css" /> </head> <body> <div id='main'> <s:form action="search"> <table> <tbody> <tr> <td><img id="logo" src="${f:url('/images/')}" alt="<bean:message key="labels.search_top_logo_alt"/>" /></td> <td><div class="input"> <html:text styleClass="query" property="query" title="Search" size="50" maxlength="1000"/> <input class="btn" type="submit" value="<bean:message key="labels.top.search"/>" name="search" /> </div></td> </tr> </tbody> </s:form></div> </body> </html>
検索トップ画面に表示される画像を変更する場合は、「logo.gif」の箇所を置き換えたいファイル名に変更します。 ファイルは「webapps/fess/images」に配置します。
<s:form> や <bean:message> などは JSP タグになります。 たとえば、<s:form> は実際の HTML 表示時に form タグに変換されます。 詳しい説明は SAStruts のサイトや JSP に関するサイトをご覧ください。
次に、検索結果一覧画面は「webapps/fess/WEB-INF/view/search.jsp」ファイルになります。
検索結果一覧画面のJSPファイルの一部
<div id="header"> <s:form action="search"> <div class="input"> <s:link action="index" title=" |Fess| Home"> <img class="logo" src="${f:url('/images/')}" alt="<bean:message key="labels.search_header_logo_alt"/>"/> </s:link> <html:text styleClass="query" property="query" title="Search" size="50" maxlength="1000" /> <input class="btn" type="submit" value="<bean:message key="labels.search"/>" name="search"/> </div> </s:form> </div>
検索結果一覧画面の上部に表示される画像を変更する場合は、「logo-head.gif」の箇所のファイル名を変更します。 「logo.gif」の場合と同様に「webapps/fess/images」に配置します。
JSP ファイルで利用している CSS ファイルを変更したい場合は「webapps/fess/css」に配置されている「style.css」を編集してください。
全文検索システムである |Fess| について、インストールから検索までと簡単なカスタマイズ方法について説明をしました。 特別な環境構築も必要なく、Java の実行環境があれば検索システムを簡単に構築できることをご紹介できたと思います。 既存のシステムにサイト検索機能を追加したいような場合にも導入できるので、ぜひお試しください。
次回は、 |Fess| がサポートするモバイルサイトの検索機能をご紹介したいと思います。