Akamai EdgeComputing を使用する Luceneは、Apache Software Foundation が開発したオープンソース検索アプリケーション、Jakarta Lucene を基礎としています。EdgeComputing のオンデマンド分散コンピューティングモデルにより、アカマイが管理するインフラ上でソフトウェア全体を実行するため、企業はハードウェアの出費を削減することができます。
Lucene 検索アプリケーション
Jakarta Lucene は、Java で記述された高パフォーマンスの全文テキスト検索エンジン ライブラリです。 このエンジンには、パワフルかつ正確、そして効率的な検索アルゴリズムが使用されています。 (http://jakarta.apache.org/lucene) Lucene の機能には次のようなものがあります:
- 多言語による検索が可能
- テキストベースのあらゆるファイル(HTML や他のテキスト変換可能ファイル)をインデックス可能
- 検索ランキングをサポートし、ベストの結果を最初に表示
- 論理演算とフレーズ検索が可能
- フィールド検索が可能(例:タイトル、作者、コンテンツなどに対象を絞った検索)
- 日付範囲を指定した検索により、タイムセンシティブな情報へのアクセスが可能
Lucene による検索アプリケーションを実装するには、まずインデックスファイルを作成します。インデックスは、ウェブサイト コンテンツのコンパイル版を含む特殊なデータベースです。インデックスの作成は Lucene インデックス作成 API により自動的に行なわれますが、インデックスに含まれるコンテンツはテキストフォーマットでなければなりません。また、インデックスに含まれるすべてのドキュメントタイプ対して、パーサーまたは抽出プログラムを使用する必要があります。Lucene には、ハードドライブ上のファイルの場所または URL を受け取り、ファイルを解析して HTML タグからテキストを抽出し、Java String オブジェクトを作成して Lucene インデックス作成 API に渡す、HTML パーサーがサンプルとして含まれています。
インデックスの仕組みの詳細については、Lucene を使用したアカマイのサイト検索例を次のリンクよりご参照いただけます: www.akamai.com。インデックスの最初のプロセスは、インデックスするコンテンツの決定です。下図 1 に示すように、インデックスする各コンテンツに対し、Lucene はネームバリューのペア(フィールド)からなる「Document object」を作成します。例えばフィールドが「Title」の場合、ネームバリューのペアは「Title」 - 「Akamai Home Page」となります。それぞれのフィールドには「field object」が割り当てられ、フィールドに関連づけられたテキストをインデックス、保存、またはトークン化するか否かを決定します。

図 1 : Lucene でのインデックス作成
「field object」は、フィールドの情報を Lucene がどのように扱うかを決定します:
- Indexed: フィールドが「indexed」の場合は、検索が可能です。Akamai.com で実装されている Lucene では、「Title」フィールドが「indexed」であるため、クエリーはユーザーの検索内容を「Title」フィールドで確認できます。Lucene では、インデックスされたどのフィールドをデフォルトで検索可能にするか、また制約検索用とするかを指定することができます。
- Stored: インデックスのフィールドが「stored」の場合は、コンテンツを検索結果に表示することができます。ページに関連づけられたサマリーは、Akamai.com の実装用のため、多くの場合インデックスに保存されます。これにより、検索結果ページに短い説明がタイトルと共に表示されます。
- Tokenized: フィールドが「tokenized」の場合は、コンテンツを一連のトークンに変換する Analyzer により実行されていることを意味します。トークンはインデックスの基本単位で、インデックスする単語 1 語を現します。トークン化のプロセスでは、Analyzer は変換ロジック(例えば、「a」や「the」などのストップワードの除去、ステミングの実行、大文字と小文字を区別しない場合に全テキストを小文字に変換するなど)を適用しながら、インデックスするテキストを抽出します。これにより、フィールドに関連づけられたテキストがコアエレメントに縮小されるため、インデックスのサイズが小さくなります。フィールドのトークン化は、フィールドがインデックスされる場合にのみ意味があります。Akamai.com では、「Title」が「tokenized」のため、Lucene は「a」や「the」などの単語は検索しません。
インデックス プロセスの最終ステップは、Lucene IndexWriter オブジェクトを使用したインデックスの作成です。IndexWriter オブジェクトは、Analyzer を使うことにより、インプットされたテキストの前処理を行ないます。Analyzer はインデックスの作成と検索の両方に使用されることに注意してください。検索テキストは、インデックスされたテキストと同じ方法で処理する必要があるため、インデックスと検索の両方に同じ Analyzer を使用することが重要になります。Akamai.com では、Lucene Standard Analyzer を使用しています。
マネージドサービスの仕組み
Lucene は全てが Java で記述されているため、アカマイの EdgeComputing サービスを使用して EdgePlatform 上で展開し、実行することができます。このモデルでは、お客様が検索インデックスとその他すべての検索アプリケーション(通常は、検索ページと検索結果ページなど)を WAR ファイルに展開し、世界中に分散するアカマイの J2EE アプリケーションサーバーで展開と実行が行なわれます。
ユーザーリクエストの処理
アカマイの EdgePlatform 上に展開された Lucene は、オリジンサイトへランタイム・リクエストを送信することなく、完全なオンデマンドのサービスとして実行できます。従ってオリジンサイトがダウンした場合でも、ユーザーは Lucene による検索を続行できます。下図 2 は、Akamai.com で検索をする場合のエンドユーザーによるリクエストを示しています。Akamai EdgeComputing により実行される Lucene を用いて展開した他のアプリケーションと同様に、オリジンサイトへリクエストを転送することなく EdgePlatform ですべてのアプリケーションを実行することができます。

図 2:ユーザーリクエストの処理
Akamai.com の例では、ユーザーがサイト全体を検索するのか(Search_Results.jsp)、あるいはクエリーをプレスリリースのみに限るのか(PR_search_results.jsp)によって、2 つの異なる検索結果ページが使用されることに注意してください。
簡単な展開と管理
他の EdgeComputing Application と同様に、お客様は Akamai EdgeComputing により実行される Lucene について詳細を知り、管理することができます。クリック操作で導入可能なため、お客様は必要に応じてアプリケーションを修正し、再実行することができます。下図 3 は、お客様が EdgePlatform 上で検索アプリケーションを開始する場合の展開モデルを示しています。

図 3:検索アプリケーションの展開
Lucene 1.3 対応の修正
Lucene を EdgeComputing で実行するため、Akamai では Lucene 1.3 に対して次のような簡単なコード変更を行ないました。ただし特定の EdgeComputing サンドボックスが許可されている場合、これらの修正は今後の EdgeComputing バージョンでは利用されない可能性があります。当面は、アカマイはこの Lucene の修正バージョンをお客様に提供します。
- org.apache.lucene.store.FSDirectory.java ファイルで論理フラグを手動で無効化(ロック)。現在、EdgeComputing のサンドボックスでは、システム プロパティの設定はできません。
private static final boolean DISABLE_LOCKS = true; - public final Lock makeLock(String 名)メソッド内の org.apache.lucene.store.FSDirectory.java ファイルでファイル作成のロックをコメントアウト。現在、EdgeComputing のサンドボックスではファイル システムへの書き込みができません。
//final File lockFile = new File(System.getProperty
("java.io.tmpdir"),
// buf.toString());
final File lockFile = null;
インデックスのロック機能は Edge では必要ありません。これは、1 つのプロセスがインデックスを読み込み、他のプロセスがそのインデックスに対して書き込みと更新を行なう場合、元の環境とは異なり、インデックスにアクセスするのは 1 つのプロセス(Edge アプリケーションサーバー)のみだからです。 - WAR ファイルのインデックスを開く場合は、WAR ファイルのインデックス ディレクトリへのパスを得るため、ServletContext オブジェクトを使用する必要があります。以下にコードの例を示します:
IndexSearcher searcher = null;
//the searcher used to open/search the index
try {
ServletContext sc = getServletContext();
searcher = new indexSearcher( IndexReader.open(sc.getRealPath
("index")));
} catch (Exception e)
{ ... }