2017.12.15 Friday
スポンサーサイト
一定期間更新がないため広告を表示しています
| スポンサードリンク | - | | - | - |
関口宏司のLuceneブログOSS検索ライブラリのLuceneおよびそのサブプロジェクト(Solr/Tika/Mahoutなど)について
2008.06.23 Monday
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¥lucene-2.3.2の下は次のようになっているはずだ:
2.インデックスの作成 付属デモのIndexFilesプログラムを使って、ディレクトリ(ツリー)に保存されているテキストファイルをインデックスに登録する。ここでは登録するテキストファイルとして「このデモのJavaソースファイル」を利用することとする。 まずは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起動コマンド全体は次のようになる:
現在のディレクトリの下にindexという名前のディレクトリが次のように作成されていれば成功である:
3.検索の実行 検索するにはSearchFilesというプログラムを使用する。クラスパスはIndexFilesと同じものを指定する。 SearchFilesを起動すると"Enter query:"というプロンプトが表示されるので、readerやwriterなど、デモプログラムに含まれていそうな単語を入力して[Enter]で検索を実行する:
"Enter query:"のプロンプトに2語以上を入れるとOR検索の意味になる:
AND検索を実行したい場合は、次のようにANDを明示する必要がある:
このように"Enter query:"のプロンプトにはいわゆるLucene標準の検索式を指定することができる。なお、この検索式のシンタックスは次のページで説明されている: http://lucene.apache.org/java/2_3_2/queryparsersyntax.html コメント
こんにちは。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 |
コメントする
この記事のトラックバックURL
トラックバック機能は終了しました。
トラックバック
luceneはとても簡単に使うことができる全文検索エンジンで、PJはluceneを使って簡単に全文検索アプリを作りたいという事が、作成動機の20%と言ってもいいくらい、luceneを重要と考えている。 なのでもっとクラス増やした方が良いんじゃ無いかと思っているが 最近関口
| nagaShimaの日記 | 2008/06/27 11:40 PM |
|
+ Solrによるブログ内検索
+ PROFILE
+ LINKS
+ Lucene&Solrデモ
+ ThinkIT記事
+ RECOMMEND
+ RECOMMEND
Lucene in Action (JUGEMレビュー »)
Erik Hatcher,Otis Gospodnetic,Mike McCandless FastVectorHighlighterについて解説記事を寄稿しました。
+ RECOMMEND
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ RECENT TRACKBACK
+ CATEGORIES
+ ARCHIVES
+ MOBILE
+ SPONSORED LINKS
|
(C) 2024 ブログ JUGEM Some Rights Reserved.
|
PAGE TOP |