Apache Lucene を使ったテキスト検索

検索機能と索引機能を手軽にアプリケーションに組み込んでください

充実した機能を備えたハイパフォーマンスのテキスト検索エンジン・ライブラリー、Apache Lucene について学びましょう。この記事では Lucene のアーキテクチャーとそのコアとなる API について解説し、Lucene を利用して、プラットフォームに依存しない全文検索、索引付け、結果の表示、そして検索機能の拡張を行う方法を説明します。

Amol Sonawane, Senior Staff Software Engineer, IBM  

Amol SonawaneAmol Sonawaneは、Bangalore にある International Institute of Information Technology の大学院を卒業したシニア・ソフトウェア・エンジニアです。供給プロセス管理やエンタープライズ・アプリケーション統合、そしてビジネス・インテリジェンスをはじめ、さまざまなドメインでソフトウェアの設計、開発を手掛けてきました。J2EE 技術とフレームワーク (Struts および Struts) を使用したアプリケーション開発の経験を積んでいます。インドの Pune に妻の Anuja と暮らす彼は、コードの作成の他、写真、チェス、パズルを趣味にしています。



2009年 8月 18日

はじめに

Lucene は、Apache Software Foundation から入手できる、極めてスケーラブルなオープンソースのテキスト検索エンジン・ライブラリーです。Lucene は商用アプリケーションでも、オープンソース・アプリケーションでも使用することができます。Lucene の強力な API は、主にテキストの索引付けと検索に重点を置いています。この API を使って、さまざまなアプリケーション (E メール・クライアント、メーリング・リスト、Web 検索、データベース検索、等々) の検索機能を作成することができます。事実、Wikipedia、TheServerSide、jGuru、そして LinkedIn などの Web サイトでは Lucene が使われています。

Lucene は、Eclipse IDE、Nutch (有名なオープンソースの Web 検索エンジン)、そして IBM®、AOL、Hewlett-Packard などの企業にも検索機能を提供しています。そんな Lucene は、Perl、Python、C++、.NET をはじめ、他の多くのプログラミング言語に移植されています。2009年7月30日現在、Java™ プログラミング言語の Lucene 最新バージョンは V2.4.1 です。

Lucene には多くの機能が備わっています。以下はその一部です。

  • 強力で正確かつ効率的な検索アルゴリズムを使用
  • 特定のクエリーと一致する文書ごとにスコアを計算し、スコアを基準として関連性の高い順にランクを付けて文書をリターン
  • 数々の強力なクエリー・タイプ (PhraseQuery、WildcardQuery、RangeQuery、FuzzyQuery、BooleanQuery など) をサポート
  • 人間が入力するリッチなクエリー式の構文解析をサポート
  • ユーザーがカスタム・ソート、フィルタリング、クエリー式構文解析を使用して検索の振る舞いを拡張可能
  • ファイル・ベースのロック機構によって索引の同時変更を防止
  • 検索および索引付けを同時に実行可能

Lucene を使用したアプリケーションの作成

図 1 に示すように、Lucene を使用してフル装備の検索アプリケーションを作成するには、主にデータの索引付け、データの検索、そして検索結果の表示という操作が必要です。

図 1. Lucene を使用してアプリケーションを作成する際のステップ
Lucene を使用してアプリケーションを作成する際のステップ

この記事で使用するコード・スニペットは、Lucene V2.4.1 を使用して Java 技術で開発したサンプル・アプリケーションから引用したものです。このサンプル・アプリケーションでは、プロパティー・ファイルに保管された一連の E メール文書に索引付けをして、Lucene のクエリー API を使用して索引を検索する方法を説明します。このサンプル・アプリケーションから、索引の基本操作も十分に理解できるはずです。


データの索引付け

Lucene では、テキスト形式のあらゆるデータに索引付けをすることができます。テキスト情報を抽出可能なデータ・ソースである限り、ほとんどすべてのデータ・ソースで Lucene を使用することができます。つまり、HTML 文書、Microsoft® Word 文書、PDF ファイルなどに保管されたデータは、Lucene で索引付けをして検索できるということです。データに索引付けをするには、最初のステップとして、データを単純なテキスト形式で使用できるようにします。それには、カスタム・パーサーとデータ・コンバーターを適用することができます。

索引付けのプロセス

索引付けとは、テキスト・データを素早く検索できる形式に変換するプロセスのことです。索引付けに似た単純な例としては、本の最後にある索引が挙げられます。索引によって、その本のなかで特定の語に関連するトピックがどこに記載されているのかがわかります。

Lucene は入力データを転置索引 (inverted index) と呼ばれるデータ構造で保管し、このデータがファイル・システムまたはメモリーに索引ファイル一式として保管されます。ほとんどの Web 検索エンジンでは、転置索引を使用しています。その理由は、ユーザーがキーワードを素早く検索できて、指定のクエリーと一致する文書を見つけられるためです。テキスト・データは索引に追加される前に、(分析プロセスにより) アナライザーによって処理されます。

分析

分析とは、テキスト・データを検索の基本単位に変換することです。この基本単位は、Term と呼ばれます。分析中には、テキスト・データで複数の操作が行われます。具体的には、単語の抽出、一般的な単語の除去、句読点の無視、基本形への変換、小文字への変換などの操作です。分析は、索引付けとクエリーの構文解析の直前に行われます。分析によってテキスト・データはトークンに変換され、これらのトークンが Term として Lucene の索引に追加されます。

Lucene には各種のアナライザー (SimpleAnalyzer、StandardAnalyzer、StopAnalyzer、SnowballAnalyzer など) があらかじめ組み込まれています。これらのアナライザーの違いは、テキストをトークン化してフィルターを適用する方法にあります。索引付けの前に分析によって単語が除去されると、索引のサイズは小さくなりますが、正確なクエリーの処理という点で悪影響が出る可能性もあります。分析プロセスをより細かく制御するには、Lucene が提供する基本ビルディング・ブロックを使って、カスタム・アナライザーを作成してください。表 1 に、いくつかの組み込みアナライザーと、それぞれのデータ処理方法を記載します。

表 1. Lucene の組み込みアナライザー
アナライザーテキスト・データで行う操作
WhitespaceAnalyzer空白文字でトークンを分割
SimpleAnalyzerアルファベット以外の文字でテキストを分割し、テキストを小文字に変換
StopAnalyzer(検索に役立たない) ストップ・ワードを除去し、テキストを小文字に変換
StandardAnalyzerこのアナライザーが認識する高度な文法 (E メール・アドレスや頭字語、中国語、日本語、および韓国語の文字、英数字など) に基づいてテキストをトークン化
テキストを小文字に変換
ストップ・ワードを除去

コアとなる索引付け用クラス

Directory
索引ファイルの保管場所を表す抽象クラス。一般的に使用されるサブクラスは、主に以下の 2 つです。
  • FSDirectory — 索引を実際のファイル・システムに保管する Directory の実装。サイズの大きな索引に役立ちます。
  • RAMDirectory — すべての索引をメモリーに保管する Directory の実装。メモリーに完全にロードしてアプリケーションの終了時に破棄できる、小さなサイズの索引に適しています。索引がメモリーに保管されていると、検索速度が比較的速くなります。
Analyzer
前述したように、アナライザーの役割はテキスト・データを事前に処理し、索引に保管されるトークンに変換することです。IndexWriter には、索引付けをする前にデータをトークン化するために使用するアナライザーを指定することができます。テキストに適切な索引付けをするためには、索引付けをする必要があるテキストの言語に適したアナライザーを使用しなければなりません。

英語には、デフォルトのアナライザーが有効に機能します。Lucene サンドボックスには他にもアナライザーがいくつかあり、なかには中国語、日本語、韓国語対応のアナライザーもあります。

IndexDeletionPolicy
削除ポリシーの実装に使用されるインターフェース。この削除ポリシーを使用して、索引ディレクトリーからどの程度以前にコミットした内容まで削除するかをカスタマイズすることができます。デフォルトの削除ポリシーは KeepOnlyLastCommitDeletionPolicy です。このポリシーでは最新のコミットのみが維持され、新しいコミットが行われると同時に、それ以前のすべてのコミットが削除されます。
IndexWriter
索引を作成、あるいは保守するためのクラス。このクラスのコンストラクターに指定するブール値が、新規索引を作成するかどうか、または既存の索引を開くかどうかを決定します。このクラスは、索引内の文書を追加、削除、更新するメソッドを提供します。

索引に対して行った変更は、まずメモリー内のバッファーに入れられ、定期的に索引ディレクトリーにフラッシュされます。IndexWriter は、索引をメモリー内のバッファーに入れてディスクに書き込む方法を制御するフィールドをいくつか公開します。索引への変更は、IndexWriter の commit または close メソッドが呼び出されるまで、IndexReader には可視になりません。IndexWriter は索引の同時更新によって索引が壊されないようにするため、ディレクトリーのロック・ファイルを作成します。IndexWriter では、ユーザーがオプションの索引削除ポリシーを指定することができます。

リスト 1. Lucene IndexWriter の使用
//Create instance of Directory where index files will be stored
Directory fsDirectory =  FSDirectory.getDirectory(indexDirectory);
/* Create instance of analyzer, which will be used to tokenize
the input data */
Analyzer standardAnalyzer = new StandardAnalyzer();
//Create a new index
boolean create = true;
//Create the instance of deletion policy
IndexDeletionPolicy deletionPolicy = new KeepOnlyLastCommitDeletionPolicy(); 
indexWriter =new IndexWriter(fsDirectory,standardAnalyzer,create,
	deletionPolicy,IndexWriter.MaxFieldLength.UNLIMITED);

索引へのデータの追加

テキスト・データを索引に追加する際に関連するクラスは 2 つあります。

Field は、検索でクエリーの対象となるデータまたは取得するデータを表すクラスです。Field クラスにはフィールド名とその値がカプセル化されます。Lucene では、フィールドに索引付けをする必要や分析の必要があるかどうか、そしてフィールドの値を保管する必要があるかどうかを指定するオプションを用意しています。これらのオプションは、フィールド・インスタンスの作成時に渡すことができます。以下の表に、Field メタデータ・オプションの詳細を記載します。

表 2. Field メタデータ・オプションの詳細
オプション内容
Field.Store.Yesフィールドの値を保管します。検索結果で表示されるフィールドに適しています (ファイル・パス、URL など)。
Field.Store.Noフィールドの値は保管されません (E メールのメッセージ本体など)。
Field.Index.No検索されないフィールドに適しています。一般に、保管されたフィールドで使用されます (ファイル・パスなど)。
Field.Index.ANALYZED索引付けと、分析が行われるフィールドに使用します (E メールのメッセージ本体および件名など)。
Field.Index.NOT_ANALYZED索引付けはされる一方、分析はされないフィールドに使用されます。フィールドの元の値を完全に維持します (日付、個人の氏名など)。

索引にデータを追加する際に使用するもう 1 つのクラス、Document は、フィールドのコレクションです。Lucene は文書とフィールドのブースティングもサポートします。ブースティング機能は、索引付けされたデータの一部に重要性を持たせたい場合に役立ちます。テキスト・ファイルに索引付けをするには、テキスト・データをフィールドにラップし、文書を作成し、その文書にフィールドを取り込み、そして IndexWriter を使って文書を索引に追加するという操作が伴います。

リスト 2 に、データを索引に追加する例を示します。

リスト 2. 索引へのデータの追加
/*Step 1. Prepare the data for indexing. Extract the data. */

String sender = properties.getProperty("sender");
String date = properties.getProperty("date");
String subject = properties.getProperty("subject");
String message = properties.getProperty("message");
String emaildoc = file.getAbsolutePath();

/* Step 2. Wrap the data in the Fields and add them to a Document */

Field senderField =
	new Field("sender",sender,Field.Store.YES,Field.Index.NOT_ANALYZED);
Field emaildatefield = 
		new Field("date",date,Field.Store.NO,Field.Index.NOT_ANALYZED); 
Field subjectField = 
	new Field("subject",subject,Field.Store.YES,Field.Index.ANALYZED);
Field messagefield = 
			new Field("message",message,Field.Store.NO,Field.Index.ANALYZED);
Field emailDocField =
	new Field("emailDoc",emaildoc,Field.Store.YES,
						Field.Index.NO);

Document doc = new Document();
// Add these fields to a Lucene Document
doc.add(senderField);
doc.add(emaildatefield);
doc.add(subjectField);
doc.add(messagefield);
doc.add(emailDocField);

//Step 3: Add this document to Lucene Index.
indexWriter.addDocument(doc);

索引付けされたデータの検索

検索とは、索引内で単語を探し、その単語が含まれる文書を見つけるプロセスです。Lucene の検索 API を使用して検索機能を作成する手順は単純明快です。このセクションでは、Lucene 検索 API の主なクラスについて説明します。

Searcher

Searcher は、オーバーロードされたさまざまな検索メソッドを持つ抽象基底クラスです。特定のディレクトリーに保管された索引を検索するためには、IndexSearcher サブクラスが一般に使用されます。Search メソッドは、計算されたスコアを基準にそれぞれにランクが付けられ、ランク順に並べられた文書のコレクションを返します。このスコアは、指定のクエリーと一致する文書ごとに Lucene が計算します。IndexSearcher はスレッド・セーフなので、複数のスレッドが同時に単一のインスタンスを使用することができます。

Term

Term は最も基本的な検索単位です。Term は、単語のテキストと、そのテキストが出現するフィールドの名前という 2 つの要素で構成されます。Term オブジェクトは索引付けにも関連しますが、作成されるのは Lucene の内部においてです。

Query とサブクラス

Query はクエリーの抽象基底クラスです。指定された単語または句を検索するには、その単語または句を Term にラップし、この Term を追加したクエリー・オブジェクトを IndexSearcher の検索メソッドに渡すという操作が伴います。

Lucene に用意された各種の具体的なクエリー実装には、TermQuery、BooleanQuery、PhraseQuery、PrefixQuery、RangeQuery、MultiTermQuery、FilteredQuery, SpanQuery などがあります。以下のセクションで、 Lucene クエリー API の主要なクエリー・クラスについて説明します。

TermQuery
索引を検索するための最も基本的なクエリーです。TermQuery は Term を 1 つ使って作成することができます。Term の値の大文字/小文字は区別されますが、必ずしもその限りではありません。重要な点として、検索対象として渡す Term は、文書の分析によって生成された Term と一致していなければならないことに注意してください。なぜなら、アナライザーは元のテキストでさまざまな操作を実行した上で索引を作成するからです。

例えば、E メールの件名が「Job openings for Java Professionals at Bangalore」で、この件名に StandardAnalyzer を使用して索引付けをしたとします。この場合、TermQuery を使って「Java」を検索しても、検索結果は 1 つも返されません。このテキストは StandardAnalyzer によって正規化され、小文字に変換されているためです。一方、小文字の「java」という単語を検索すれば、この単語が件名フィールドに含まれるすべてのメールが返されます。

リスト 3. TermQuery を使用した検索
//Search mails having the word "java" in the subject field
Searcher indexSearcher = new IndexSearcher(indexDirectory);
Term term = new Term("subject","java");
Query termQuery = new TermQuery(term);	 
TopDocs topDocs = indexSearcher.search(termQuery,10);
RangeQuery
範囲を指定して検索するには、RangeQuery を使用します。索引ではすべての Term が辞書の順番で並べられるので、Lucene の RangeQuery を使用すれば、範囲内に含まれる Term を検索することができます。範囲を指定するには、範囲の開始 Term と終了 Term を使用します。この 2 つの Term は、範囲に含めることも除外することもできます。
リスト 4. 範囲内での検索
/* RangeQuery example:Search mails from 01/06/2009 to 6/06/2009 
both inclusive */
Term begin = new Term("date","20090601");
Term end = new Term("date","20090606");
Query query = new RangeQuery(begin, end, true);
PrefixQuery
接頭辞が付いた単語を検索するには、PrefixQuery を使って、指定した接頭辞で始まる Term を含む文書と一致させるクエリーを作成します。
リスト 5. PrefixQuery を使用した検索
//Search mails having sender field prefixed by the word 'job'
PrefixQuery prefixQuery = new PrefixQuery(new Term("sender","job"));
PrefixQuery query = new PrefixQuery(new Term("sender","job"));
BooleanQuery
BooleanQuery を使用して任意の数のクエリー・オブジェクトを組み合わせることで、強力なクエリーを作成することができます。BooleanQuery でクエリー・オブジェクトを組み合わせる場合は、query を指定するとともに、クエリーを行うべきか、クエリーを行わなければならないのか、それともクエリーを行ってはならないのかを示す節をクエリーに関連付けて指定します。BooleanQuery に含められる節の数は、デフォルトでは最大 1,024 に制限されます。setMaxClauseCount メソッドを呼び出すと、節の最大数を設定することができます。
リスト 6. BooleanQuery を使用した検索
// Search mails have both 'java' and 'bangalore' in the subject field
Query query1 = new TermQuery(new Term("subject","java"));
Query query2 = new TermQuery(new Term("subject","bangalore"));
BooleanQuery query = new BooleanQuery();
query.add(query1,BooleanClause.Occur.MUST);
query.add(query2,BooleanClause.Occur.MUST);
PhraseQuery
句を検索する場合には、PhraseQuery を使用します。PhraseQuery が突き合わせるのは、特定の Term シーケンスが含まれる文書です。PhraseQuery は、索引に保管された Term の位置情報を使用します。突き合わせで考慮する Term 間の距離は、スロップ (slop) と呼ばれます。デフォルトのスロップ値はゼロです。この値は、setSlop メソッドを呼び出して設定することができます。PhraseQuery は複数の Term からなる句もサポートします。
リスト 7. PhraseQuery を使用した検索
/* PhraseQuery example: Search mails that have phrase 'job opening j2ee'
   in the subject field.*/
PhraseQuery query = new PhraseQuery();
query.setSlop(1);
query.add(new Term("subject","job"));
query.add(new Term("subject","opening"));
query.add(new Term("subject","j2ee"));
WildcardQuery
ワイルドカード検索クエリーを実装する WildcardQuery では、arch* のような検索を行えます (つまり、architect、architecture などが含まれる文書の検索)。使用する標準ワイルドカードは、以下の 2 つです。
  • ゼロ以上の場合は *
  • 1 つ以上の場合は ?
ワイルドカード・クエリーの先頭にパターンを使用して検索すると、一致する文書を見つけるために索引内のすべての Term がクエリーの対象となるため、パフォーマンスが低下する場合があります。
リスト 8. WildcardQuery を使用した検索
//Search for 'arch*' to find e-mail messages that have word 'architect' in the subject
field./
Query query = new WildcardQuery(new Term("subject","arch*"));
FuzzyQuery
類似した Term を検索するには、指定された単語と似ている単語と一致させる FuzzyQuery を使用します。類似性の測定基準となるのは、Levenshtein (編集距離) アルゴリズムです。リスト 9 では FuzzyQuery を使って、ミススペリングされた単語「admnistrtor」に似た一致を検索しています。ただし、この単語に索引付けはされていません。
リスト 9. FuzzyQuery を使用した検索
/* Search for emails that have word similar to 'admnistrtor' in the
subject field. Note we have misspelled admnistrtor here.*/
Query query = new FuzzyQuery(new Term("subject", "admnistrtor"));
QueryParser
QueryParser は、人間が入力したクエリー文字列の構文解析に役立ちます。QueryParser を使用すれば、ユーザーが入力したクエリー式を Lucene クエリー・オブジェクトに構文解析してから IndexSearcher の検索メソッドに渡すことができます。QueryParser は、リッチなクエリー式を構文解析することが可能であり、人間が入力したクエリー文字列を、具体的なクエリー・サブクラスのうちの 1 つに内部で変換します。*? などの特殊文字は、バックスラッシュ (\) でエスケープする必要があります。テキストによるブール・クエリーは、演算子 ANDOR、および NOT を使用して作成することができます。
リスト 10. 人間が入力したクエリー式の検索
QueryParser queryParser = new QueryParser("subject",new StandardAnalyzer());
// Search for emails that contain the words 'job openings' and '.net' and 'pune'
Query query = queryParser.parse("job openings AND .net AND pune");

検索結果の表示

IndexSearcher は、ランクが付けられた検索結果 (指定されたクエリーと一致する文書など) を参照する配列を返します。取得する上位検索結果の件数を決めるには、IndexSearcher の検索メソッドに件数を指定します。その上で、カスタマイズしたページングを作成することができます。検索結果を表示するには、カスタム Web アプリケーションまたはデスクトップ・アプリケーションを追加することができます。検索結果を取得する際に必要な主なクラスは、ScoreDocTopDocs です。

ScoreDoc
検索結果に含まれる文書への単純なポインター。このポインターは、索引内での文書の位置と、Lucene によって計算されたスコアをカプセル化します。
TopDocs
検索結果の合計件数と ScoreDoc の配列をカプセル化します。

以下のコード・スニペットに、検索結果に含まれる文書を取得する方法を示します。

リスト 11. 検索結果の表示
/* First parameter is the query to be executed and 
   second parameter indicates the no of search results to fetch */
   TopDocs topDocs = indexSearcher.search(query,20);	
   System.out.println("Total hits "+topDocs.totalHits);

   // Get an array of references to matched documents
   ScoreDoc[] scoreDosArray = topDocs.scoreDocs;	
   for(ScoreDoc scoredoc: scoreDosArray){
      //Retrieve the matched document and show relevant details
      Document doc = indexSearcher.doc(scoredoc.doc);
      System.out.println("\nSender: "+doc.getField("sender").stringValue());
      System.out.println("Subject: "+doc.getField("subject").stringValue());
      System.out.println("Email file location: "
					+doc.getField("emailDoc").stringValue());	
   }

基本的な索引操作

基本的な索引操作には、文書の削除とブースティングがあります。

索引からの文書の削除

アプリケーションでは、索引を最新のデータで更新し、古いデータを削除しなければならない場合がよくあります。例えば Web 検索エンジンでは、新しい Web ページを追加し、存在しない Web ページを削除しなければならないため、定期的に索引を更新する必要があります。索引でのこれらの操作は、Lucene の IndexReader インターフェースを使って実行することができます。

IndexReader は、索引にアクセスするための各種メソッドを提供する抽象クラスです。Lucene が内部で文書を参照するために使用する文書番号は、索引に文書が追加されたり、索引から文書が削除されたりすると、それに応じて変更されます。索引内の文書には、この文書番号を使用してアクセスします。IndexWriter によってすでに開かれているディレクトリー内の索引は、IndexReader を使用して更新することはできません。IndexReader によってディレクトリーを開く時に、必ずディレクトリー内の索引のスナップショットが検索されます。索引に対する変更は、IndexReader によって再びディレクトリーが開かれるまで可視になりません。重要な点として、Lucene を使用するアプリケーションは、IndexReader によって再びディレクトリーを開くことで最新の索引の更新内容を表示します。

リスト 12. 索引からの文書の削除
// Delete all the mails from the index received in May 2009.
IndexReader indexReader = IndexReader.open(indexDirectory);
indexReader.deleteDocuments(new Term("month","05"));
//close associate index files and save deletions to disk
indexReader.close();

文書およびフィールドのブースティング

場合によっては、索引付けされたデータの一部に他よりも重要性を持たせなければならないことがあります。そのような場合に使えるのが、文書またはフィールドにブースト係数を設定するという方法です。デフォルトでは、すべての文書およびフィールドのブースト係数は 1.0 に設定されています。

リスト 13. フィールドのブースティング
if(subject.toLowerCase().indexOf("pune") != -1){
// Display search results that contain pune in their subject first by setting boost factor
	subjectField.setBoost(2.2F);
}
//Display search results that contain 'job' in their sender email address
if(sender.toLowerCase().indexOf("job")!=-1){	
	luceneDocument.setBoost(2.1F);
}

拡張検索機能

Lucene にはソーティング (sorting) という高度な機能があります。この機能では、索引内での文書の相対位置を示すフィールドを基準に検索結果をソートすることができます。ソートに使用するフィールドには索引を付ける必要がありますが、トークン化する必要はありません。ソート・フィールドに組み込める Term の値は、int、long、float、String の 4 種類です。

検索結果は、索引順でソートすることもできます。Lucene は関連性が高い順に結果をソートします。例えばデフォルトでは、計算されたスコアが高い順にソートされます。ソート順についても、変更は可能です。

リスト 14. 検索結果のソート
/* Search mails having the word 'job' in subject and return results
   sorted by sender's email in descending order.
 */
SortField sortField = new SortField("sender", true);	
Sort sortBySender = new Sort(sortField);
WildcardQuery query = new WildcardQuery(new Term("subject","job*"));
TopFieldDocs topFieldDocs = 
			indexSearcher.search(query,null,20,sortBySender);
//Sorting by index order
topFieldDocs = indexSearcher.search(query,null,20,Sort.INDEXORDER);

フィルタリングとは、検索空間を制限して、文書のサブセットのみを検索対象と見なすことができるようにするプロセスです。この機能を使用すれば、検索結果の絞り込み検索を実装したり、検索結果に基づくセキュリティーを実装したりすることができます。Lucene にはあらかじめ、BooleanFilter、CachingWrapperFilter、ChainedFilter、DuplicateFilter、PrefixFilter、QueryWrapperFilter、RangeFilter、RemoteCachingWrapperFilter、SpanFilter などの多種多様なフィルターが組み込まれています。フィルターを IndexSearcher の検索メソッドに渡すことで、フィルター基準と一致する文書をフィルタリングすることができます。

リスト 15. 検索結果のフィルタリング
/*Filter the results to show only mails that have sender field 
prefixed with 'jobs' */
Term prefix = new Term("sender","jobs");
Filter prefixFilter = new PrefixFilter(prefix);
WildcardQuery query = new WildcardQuery(new Term("subject","job*"));
indexSearcher.search(query,prefixFilter,20);

まとめ

Apache の Lucene は、強力な索引付け機能と検索機能をアプリケーションに提供する、極めて人気の高いオープンソースの検索ライブラリーです。その単純で使いやすい API は、索引付けと検索の内部構造を最小限理解するだけで使用することができます。この記事では、Lucene のアーキテクチャーとそのコアとなる API について説明しました。

Lucene はこれまで、知名度の高い多くの Web サイトや、組織が使用する各種の検索アプリケーションで使われてきました。そのため Lucene は、他の数多くのプログラミング言語に移植されています。また、Lucene には大規模で活発な技術ユーザー・コミュニティーもあります。使いやすくスケーラブルでハイパフォーマンスのオープンソース検索ライブラリーをお探しなら、Apache Lucene は理想的な選択肢となるはずです。


ダウンロード

内容ファイル名サイズ
Lucene code sampleos-apache-lucenesearch-SampleApplication.zip755KB

参考文献

学ぶために

  • Apache Lucene の全容を学んでください。最新ニュースもこのサイトで入手できます。
  • Lucene in Action』(Erik Hatcher、Otis Gospodnetic 共著) は、権威ある Lucene 入門書です。この本では、MS Word、PDF、HTML、XML など、明らかに知っておかなければならないタイプのデータに索引付けをする方法を説明しています。また、検索、ソート、フィルタリング、そして検索結果の強調表示についても紹介しています。
  • ソフトウェア開発者を対象とした興味深いインタービューや討論については、developerWorks ポッドキャストをチェックしてください。
  • developerWorks の Technical events and webcasts で最新情報を入手してください。
  • developerWorks を Twitter でフォローしてください。
  • 世界中で近日中に予定されている IBM オープンソース開発者を対象とした会議、見本市、ウェブキャストやその他のイベントをチェックしてください。
  • オープンソース技術を使用して開発し、IBM の製品と併用するときに役立つ広範囲のハウツー情報、ツール、およびプロジェクト・アップデートについては、developerWorks Open source ゾーンを参照してください。
  • 無料の developerWorks On demand demos で、IBM およびオープンソースの技術と製品機能を調べて試してみてください。

製品や技術を入手するために

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Java technology
ArticleID=428319
ArticleTitle=Apache Lucene を使ったテキスト検索
publish-date=08182009