関口宏司のLuceneブログ

OSS検索ライブラリのLuceneおよびそのサブプロジェクト(Solr/Tika/Mahoutなど)について
<< Web Spam Detection for Heritrix - Heritrix用Webスパム発見器 | main | Distributed Search on Solr 1.3 >>
Lucene付属デモの使い方(初心者向き)
最近Lucene/Solrの利用者人口の増加を実感している。

初心者向きにモノを書いたり話したりすることが多くなり(もちろん利用経験者とのやりとりも増加中である)、そのため初めての人向きのネタが必要になることが増えてきている。

そこでこの記事では現在の安定版であるLucene 2.3.2の付属デモの使い方をまとめておこうと思う。

この記事では付属デモの「使い方」だけで、その中で使われるクラスなどの解説は後々別のところで書くこととする。

オペレーションの説明を具体的にするためにWindowsのC:ドライブの下にworkというディレクトリを作成し、その下で作業することを想定している。他のOSを使用する場合などは適宜読み替えて欲しい。なお、Java SDKは1.4以上があらかじめインストールされている必要があり、binディレクトリがPATH環境変数に含まれていなければならない。

1.LuceneのダウンロードとZIPの展開

以下のページに提示されているURLのいずれかをクリックしてダウンロードページに移動し、lucene-2.3.2.zipをダウンロードする:

http://www.apache.org/dyn/closer.cgi/lucene/java/

ダウンロードしたらZIPファイルをC:¥workに展開する。コマンドプロンプトを開いてC:¥workでdirコマンドを実行すると、次のように表示されるはずである:



C:¥work>dir

2008/06/23 09:08 <DIR> .
2008/06/23 09:08 <DIR> ..
2008/06/22 12:04 <DIR> lucene-2.3.2
2008/06/22 11:57 11,587,514 lucene-2.3.2.zip
1 個のファイル 11,587,514 バイト
3 個のディレクトリ 8,833,630,208 バイトの空き領域

C:¥work>



またC:¥work¥lucene-2.3.2の下は次のようになっているはずだ:



C:¥work>dir lucene-2.3.2

2008/06/22 12:04 <DIR> .
2008/06/22 12:04 <DIR> ..
2008/05/01 13:28 3,716 BUILD.txt
2008/05/01 13:32 10,184 build.xml
2008/05/01 13:28 105,519 CHANGES.txt
2008/06/22 11:58 <DIR> contrib
2008/06/22 11:58 <DIR> docs
2008/05/01 13:28 11,358 LICENSE.txt
2008/05/01 13:31 665,686 lucene-core-2.3.2.jar
2008/05/01 13:32 52,989 lucene-demos-2.3.2.jar
2008/05/01 13:32 668,864 luceneweb.war
2008/05/01 13:28 362 NOTICE.txt
2008/05/01 13:28 1,157 README.txt
2008/06/22 11:58 <DIR> src
9 個のファイル 1,519,835 バイト
6 個のディレクトリ 8,833,630,208 バイトの空き領域

C:¥work>



2.インデックスの作成

付属デモのIndexFilesプログラムを使って、ディレクトリ(ツリー)に保存されているテキストファイルをインデックスに登録する。ここでは登録するテキストファイルとして「このデモのJavaソースファイル」を利用することとする。

まずはC:¥work¥lucene-2.3.2ディレクトリに移動する:



C:¥work>cd lucene-2.3.2

C:¥work¥lucene-2.3.2>



Lucene本体はlucene-core-2.3.2.jarに、コンパイル済みのデモプログラムはlucene-demos-2.3.2.jarにパッケージされているので、デモ起動時のクラスパスにはこの2つのJARファイルを指定すればよい。

また、IndexFilesプログラムの第一引数にはインデックスに登録するテキストファイルのトップディレクトリを指定する。ここではデモのJavaソースが保存されているディレクトリsrcを指定する。

よってIndexFiles起動コマンド全体は次のようになる:



C:¥work¥lucene-2.3.2>java -cp lucene-core-2.3.2.jar;lucene-demos-2.3.2.jar org.apache.lucene.demo.IndexFiles src
Indexing to directory 'index'...
adding src¥demo¥org¥apache¥lucene¥demo¥DeleteFiles.java
adding src¥demo¥org¥apache¥lucene¥demo¥FileDocument.java
adding src¥demo¥org¥apache¥lucene¥demo¥html¥Entities.java
adding src¥demo¥org¥apache¥lucene¥demo¥html¥HTMLParser.java
adding src¥demo¥org¥apache¥lucene¥demo¥html¥HTMLParser.jj
adding src¥demo¥org¥apache¥lucene¥demo¥html¥HTMLParserConstants.java
adding src¥demo¥org¥apache¥lucene¥demo¥html¥HTMLParserTokenManager.java
adding src¥demo¥org¥apache¥lucene¥demo¥html¥ParseException.java
adding src¥demo¥org¥apache¥lucene¥demo¥html¥ParserThread.java
adding src¥demo¥org¥apache¥lucene¥demo¥html¥SimpleCharStream.java
adding src¥demo¥org¥apache¥lucene¥demo¥html¥Tags.java
adding src¥demo¥org¥apache¥lucene¥demo¥html¥Test.java
adding src¥demo¥org¥apache¥lucene¥demo¥html¥Token.java
adding src¥demo¥org¥apache¥lucene¥demo¥html¥TokenMgrError.java
adding src¥demo¥org¥apache¥lucene¥demo¥HTMLDocument.java
adding src¥demo¥org¥apache¥lucene¥demo¥IndexFiles.java
adding src¥demo¥org¥apache¥lucene¥demo¥IndexHTML.java
adding src¥demo¥org¥apache¥lucene¥demo¥SearchFiles.java
adding src¥jsp¥configuration.jsp
adding src¥jsp¥footer.jsp
adding src¥jsp¥header.jsp
adding src¥jsp¥index.jsp
adding src¥jsp¥README.txt
adding src¥jsp¥results.jsp
adding src¥jsp¥WEB-INF¥web.xml
Optimizing...
1129 total milliseconds

C:¥work¥lucene-2.3.2>



現在のディレクトリの下にindexという名前のディレクトリが次のように作成されていれば成功である:



C:¥work¥lucene-2.3.2>dir index

2008/06/23 09:35 <DIR> .
2008/06/23 09:35 <DIR> ..
2008/06/23 09:35 20 segments.gen
2008/06/23 09:35 45 segments_3
2008/06/23 09:35 42,445 _0.cfs
3 個のファイル 42,510 バイト
2 個のディレクトリ 8,833,810,432 バイトの空き領域

C:¥work¥lucene-2.3.2>



3.検索の実行

検索するにはSearchFilesというプログラムを使用する。クラスパスはIndexFilesと同じものを指定する。

SearchFilesを起動すると"Enter query:"というプロンプトが表示されるので、readerやwriterなど、デモプログラムに含まれていそうな単語を入力して[Enter]で検索を実行する:



C:¥work¥lucene-2.3.2>java -cp lucene-core-2.3.2.jar;lucene-demos-2.3.2.jar org.apache.lucene.demo.SearchFiles
Enter query:
reader
Searching for: reader
8 total matching documents
1. src¥demo¥org¥apache¥lucene¥demo¥FileDocument.java
2. src¥demo¥org¥apache¥lucene¥demo¥SearchFiles.java
3. src¥demo¥org¥apache¥lucene¥demo¥DeleteFiles.java
4. src¥demo¥org¥apache¥lucene¥demo¥html¥Test.java
5. src¥demo¥org¥apache¥lucene¥demo¥IndexHTML.java
6. src¥demo¥org¥apache¥lucene¥demo¥HTMLDocument.java
7. src¥demo¥org¥apache¥lucene¥demo¥html¥HTMLParser.jj
8. src¥demo¥org¥apache¥lucene¥demo¥html¥HTMLParser.java
Enter query:
writer
Searching for: writer
4 total matching documents
1. src¥demo¥org¥apache¥lucene¥demo¥IndexFiles.java
2. src¥demo¥org¥apache¥lucene¥demo¥IndexHTML.java
3. src¥demo¥org¥apache¥lucene¥demo¥html¥HTMLParser.jj
4. src¥demo¥org¥apache¥lucene¥demo¥html¥HTMLParser.java
Enter query:



"Enter query:"のプロンプトに2語以上を入れるとOR検索の意味になる:



Enter query:
reader writer
Searching for: reader writer
9 total matching documents
1. src¥demo¥org¥apache¥lucene¥demo¥IndexHTML.java
2. src¥demo¥org¥apache¥lucene¥demo¥html¥HTMLParser.jj
3. src¥demo¥org¥apache¥lucene¥demo¥IndexFiles.java
4. src¥demo¥org¥apache¥lucene¥demo¥html¥HTMLParser.java
5. src¥demo¥org¥apache¥lucene¥demo¥FileDocument.java
6. src¥demo¥org¥apache¥lucene¥demo¥SearchFiles.java
7. src¥demo¥org¥apache¥lucene¥demo¥DeleteFiles.java
8. src¥demo¥org¥apache¥lucene¥demo¥html¥Test.java
9. src¥demo¥org¥apache¥lucene¥demo¥HTMLDocument.java
Enter query:



AND検索を実行したい場合は、次のようにANDを明示する必要がある:



Enter query:
reader AND writer
Searching for: +reader +writer
3 total matching documents
1. src¥demo¥org¥apache¥lucene¥demo¥IndexHTML.java
2. src¥demo¥org¥apache¥lucene¥demo¥html¥HTMLParser.jj
3. src¥demo¥org¥apache¥lucene¥demo¥html¥HTMLParser.java
Enter query:



このように"Enter query:"のプロンプトにはいわゆるLucene標準の検索式を指定することができる。なお、この検索式のシンタックスは次のページで説明されている:

http://lucene.apache.org/java/2_3_2/queryparsersyntax.html

| 関口宏司 | Hello, Lucene (入門者向けプログラム例) | 10:06 | comments(9) | trackbacks(1) |
こんにちは。Luceneに興味を持ち、こちらのブログにたどり着きました。量も豊富で内容も深く、為になっています。

ところで、今、Lucene2.3で、日本語の文章を取り扱うときには、どのようにするのがお勧めでしょうか。

関口様の書籍では、Lucene1.9ベースでしたのでlucene-jaを使うやり方を書かれていたように思います(すみません、書籍が今手元にないもので...)が、2系はtestと名前がついていて、今一手を出しにくい感じがします。

GoSenはSenの枝分かれということもあり、Javaでとりあえず完結するし、テストスイート揃っていたり、コードもJava1.5ベースで書かれていて、いいなと思う反面、Luceneで使う場合、Analyzerを自作する必要があるように見受けられます。

お手数でなければ、ご教授いただければ幸いです。
| litailang | 2008/08/31 9:24 AM |
こんにちは。

Lucene-jaでいいと思います。"test"とついているのは気にしなければいいです。

GoSenは使ったことないですが、SenでもGoSenでもAnalyzerはアプリに合わせて多少自作することになると思います。
| 関口 | 2008/08/31 10:15 AM |
ありがとうございます。

>SenでもGoSenでもAnalyzerはアプリに合わせて多少自作することになると思います。

なるほど、そういう雰囲気なのですね。まだあまり手を動かしていないので、どのあたりまで手を入れて、というのが感覚的にわからないので助かります。

| litailang | 2008/09/01 11:57 AM |
ご本(「Apache Lucene 入門」)を購入し精読いたしました.ただsenを使うとLucene1.9.1では正常に動作しますが,2.3以上になると検索時にJapaneseAnalzerでエラーが発生して使えません.しかたなく,CJKAnalyzerを使っていますが,これは私だけのことでしょうか.
 というのも,こちらのブログを拝見するとsenがLucene2.3で使えているようなのでとても???な気持ちです.senは1.2.2.1でLucene-ja-2.0test2をとともに使っていますがうまく動きません.私は何か大きな間違いをしているような気がします.なにがまずいのか簡単なヒントでも結構ですがご教授ねがえませんでしょうか.

p.s.
ご本はAmazonの中古で¥18,000で購入しましたが,とてもよいご本だと思います.いまでも十分参考になります.しかし,1.9.1対応ですから,そろそろ改定版を出されることを切に希望いたします.
 よろしくお願いいたします.
| 川場 隆 | 2009/11/18 6:43 PM |
エラーというのはどういうエラーでしょうか。

> ご本はAmazonの中古で¥18,000で購入しましたが

そ、それは高かったですね。。。恐縮です。図書館で結構借りられたりします、東京都の話ですが。

改訂版は技術評論社が判断することなので、、、コメントはありがたく、拝見しました。
| 関口 | 2009/11/18 7:22 PM |
ご返信ありがとうございます.説明すると次のようなエラーです.

プログラムは次のような簡単なインデックス作成です.
1.9.1の古い形式で書いたものでは,senとJavaneseAnalyzeがきちんと動作し,検索もできました.
しかし,2.9.1ではIndexWriterのaddDocument()でエラーになります.
ただ,analyserをCJKAnalyerに変更するときちんと動きます・
JapaneseAnalyerというよりわたしの書き方がどこか間違っている気がします.
ご多忙なのではないかと恐縮ですが,どこに間違いがあるのかお教えいただければ幸いです.


// 作成したプログラム
public class SampleIndex {
public static void main(String[] args)throws IOException{

System.setProperty("sen.home", "D:¥¥Development¥¥test¥¥zTestLucene.2.9.1_SEN¥¥sen-1.2.2.1");
String sourceDir = "D:¥¥Development¥¥test¥¥zTestLucene.2.9.1_SEN¥¥text";
String indexDir = "D:¥¥Development¥¥test¥¥zTestLucene.2.9.1_SEN¥¥index";

File directory = new File(sourceDir);
String[] filepath = directory.list();
Directory fsDirectory = FSDirectory.open(new File(indexDir));
//Analyzer analyzer = new CJKAnalyzer(); // こちらはOK
Analyzer analyzer = new JapaneseAnalyzer(); // こちらは実行時例外(java.lang.IllegalAccessError)
boolean create = true;
IndexDeletionPolicy deletionPolicy = new KeepOnlyLastCommitDeletionPolicy();
IndexWriter writer = new IndexWriter(
fsDirectory,
analyzer,
create,
deletionPolicy,
IndexWriter.MaxFieldLength.UNLIMITED
);
for (int i = 0; i < filepath.length; i++) {
Document doc = new Document();
String absPath = FileGear.pathString(sourceDir)+ filepath[i];
Field f1 = new Field("url", absPath, Field.Store.YES, Field.Index.NO);
doc.add(f1);
Reader reader = new FileReader(absPath);
Field f2 = new Field("contents",reader);
doc.add(f2);

writer.addDocument(doc); // ここでエラーが発生(sampleIndex.java 48行目)
}
writer.optimize();
writer.close();
}
}

//// 実行時例外のスタックトレース /////
2009/11/21 14:00:22 net.java.sen.Dictionary <init>
情報: token file = D:
| 川場隆 | 2009/11/21 2:38 PM |
実行時のスタックトレースが切れてしまいました.以下に再送します.


//// 実行時例外のスタックトレース /////
2009/11/21 14:00:22 net.java.sen.Dictionary <init>
情報: token file = D:¥Development¥test¥zTestLucene.2.9.1_SEN¥sen-1.2.2.1¥dic/token.sen
2009/11/21 14:00:22 net.java.sen.Dictionary <init>
情報: time to load posInfo file = 0[ms]
2009/11/21 14:00:22 net.java.sen.Dictionary <init>
情報: double array trie dictionary = D:¥Development¥test¥zTestLucene.2.9.1_SEN¥sen-1.2.2.1¥dic/da.sen
2009/11/21 14:00:22 net.java.sen.util.DoubleArrayTrie load
情報: loading double array trie dict = D:¥Development¥test¥zTestLucene.2.9.1_SEN¥sen-1.2.2.1¥dic/da.sen
2009/11/21 14:00:22 net.java.sen.util.DoubleArrayTrie load
情報: loaded time = 0.328[ms]
2009/11/21 14:00:22 net.java.sen.Dictionary <init>
情報: pos info file = D:¥Development¥test¥zTestLucene.2.9.1_SEN¥sen-1.2.2.1¥dic/posInfo.sen
2009/11/21 14:00:22 net.java.sen.Dictionary <init>
情報: time to load pos info file = 0[ms]
2009/11/21 14:00:22 net.java.sen.Tokenizer loadConnectCost
情報: connection file = D:¥Development¥test¥zTestLucene.2.9.1_SEN¥sen-1.2.2.1¥dic¥matrix.sen
2009/11/21 14:00:23 net.java.sen.Tokenizer loadConnectCost
情報: time to load connect cost file = 156[ms]
Exception in thread "main" java.lang.IllegalAccessError
at org.apache.lucene.analysis.ja.POSFilter.<init>(POSFilter.java:51)
at org.apache.lucene.analysis.ja.JapaneseAnalyzer.tokenStream(JapaneseAnalyzer.java:202)
at org.apache.lucene.analysis.Analyzer.reusableTokenStream(Analyzer.java:51)
at org.apache.lucene.index.DocInverterPerField.processFields(DocInverterPerField.java:124)
at org.apache.lucene.index.DocFieldProcessorPerThread.processDocument(DocFieldProcessorPerThread.java:244)
at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:779)
at org.apache.lucene.index.DocumentsWriter.addDocument(DocumentsWriter.java:757)
at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:2472)
at org.apache.lucene.index.IndexWr
| 川場隆 | 2009/11/21 2:39 PM |
<補足>
ソースコードの中に次のような見慣れないコードがありました.もうしわけございません.
String absPath = FileGear.pathString(sourceDir)+filepath[i];
これは,単にファイルの絶対パスを作るだけのものです.
| 川場隆 | 2009/11/21 2:49 PM |
> しかし,2.9.1ではIndexWriterのaddDocument()でエラーになります.

はい、Lucene 2.9ではTokenStream APIが若干変わってしまったので、エラーになる可能性はあります。どのような変更があったかについては、Lucene 2.9のCHANGES.txtに書いてあります。ブログの方にも書きたいと思いつつ、なかなか忙しく書けておりません。。。
| 関口 | 2009/11/22 10:30 AM |









http://lucene.jugem.jp/trackback/220
lucene
luceneはとても簡単に使うことができる全文検索エンジンで、PJはluceneを使って簡単に全文検索アプリを作りたいという事が、作成動機の20%と言ってもいいくらい、luceneを重要と考えている。 なのでもっとクラス増やした方が良いんじゃ無いかと思っているが 最近関口
| nagaShimaの日記 | 2008/06/27 11:40 PM |
+ Solrによるブログ内検索
+ PROFILE
 123456
78910111213
14151617181920
21222324252627
28293031   
<< May 2017 >>
+ LINKS
検索エンジン製品 - 比較のポイント
商用検索エンジンを購入した企業担当者は読まないでください。ショックを受けますから・・・
>>製品比較 10のポイント
+ Lucene&Solrデモ
+ ThinkIT記事
+ RECOMMEND
Apache Solr入門 ―オープンソース全文検索エンジン
Apache Solr入門 ―オープンソース全文検索エンジン (JUGEMレビュー »)
関口 宏司,三部 靖夫,武田 光平,中野 猛,大谷 純
+ RECOMMEND
Lucene in Action
Lucene in Action (JUGEMレビュー »)
Erik Hatcher,Otis Gospodnetic,Mike McCandless
FastVectorHighlighterについて解説記事を寄稿しました。
+ RECOMMEND
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ RECENT TRACKBACK
+ CATEGORIES
+ ARCHIVES
+ MOBILE
qrcode
+ SPONSORED LINKS