関口宏司のLuceneブログ

OSS検索ライブラリのLuceneおよびそのサブプロジェクト(Solr/Tika/Mahoutなど)について
スポンサーサイト

一定期間更新がないため広告を表示しています

| スポンサードリンク | - | | - | - |
IndexWriterのコンストラクタを整理する(初心者向き)
Lucene 2.2から2.3にかけて大変貌を遂げ、たぶんこれからもちょくちょく変更が入ると思われるIndexWriterはコンストラクタを多数持つ。しかしその半数以上はDeprecatedとなっている。

書籍「Apache Lucene入門」はLucene 1.9ベースなので、現在のJARを使ってサンプルプログラムをコンパイルするとおそらく多数のWarningが出ることと思う。

それでここでは、今の時点のIndexWriterのコンストラクタの使い方(使い分け)をまとめておく。

IndexWriterのコンストラクタがとる引数は、次の表のようになる(このブログ記事の日付時点でのJavadocの情報に基づく):

index analyzer create (Expert)
IndexDeletionPolicy
MaxFieldLength
Directory
Directory -
Directory -
Directory - -
File -
File - -
String -
String - -


この表を見ると、index、analyzer、MaxFieldLengthが必須引数であることがわかる。

このうちindexは転置索引のディレクトリを指定する引数で、DirectoryかFileかStringで指定できるようになっている。FileとStringはJavaのクラスのjava.io.Fileとjava.lang.Stringのことだ。DirectoryはLuceneのクラスで、FSDirectoryかRAMDirectoryを指定する。FSDirectoryを使えば転置索引はハードディスク上に作られるし、RAMDirectoryを指定すればメモリ上に作られる。

analyzerにはLuceneのAnalyzerクラスのオブジェクトを指定する(JapaneseAnalyzer、CJKAnalyzer、StandardAnalyzerなど)。

MaxFieldLengthには索引付けする単語数に上限を設ける(MaxFieldLength.LIMITED)か、設けない(MaxFieldLength.UNLIMITED)かを指定する。上限を設ける場合は、これまでのバージョンと互換のデフォルト値10,000語が設定される。

IndexDeletionPolicy(詳しくはこちら)を指定する場合は必然的にindexにDirectory型を指定するIndexWriterのコンストラクタを使用することになる。

残りのcreate引数(boolean型)は、3種類のindexの型を指定するコンストラクタのそれぞれに「指定する」のと「指定しない」バージョンが存在する。

createを「指定する」バージョンでは、転置索引を新規作成する(create=true)のか、既存の転置索引に追加登録する(create=false)のかをcreate引数で指定する。「指定しない」バージョンでは転置索引が存在しなければ新規作成し、存在すれば追加登録する、という動作となる。

create引数を指定しないバージョンのIndexWriterの導入経緯はこちらの記事も参考になるだろう。
| 関口宏司 | Luceneクラス解説 | 11:28 | comments(2) | trackbacks(0) |
ロンウイットの社名の由来
「ロンウイット(RONDHUIT)」という社名は家の近所の「丸八通り」の「丸」と「八」を仏語にしたものである(丸=ROND、八=HUIT)。

ロンウイットという名前を思いつくまではいろいろ悩み、次のような高橋メソッドによるプレゼンを作って人に相談したりもした。

http://handsout.jp/slide/532

このプレゼンは以前別のWebサイトに掲載したものであるが、現在はそのサイトがなくなってしまったようだ。

最近PCのフォルダを整理していたときに当時のテキストファイル原稿を発見したので、それをもとにPPTファイルを作成し、http://handsout.jp/に掲載しなおしたものである。
| 関口宏司 | 会社の立ち上げ | 20:57 | comments(0) | trackbacks(0) |
Distributed Search on Solr 1.3
先日「第1回 Railsアプリケーション開発者のためのSolr入門」という無料セミナーを開催し、無事終了した。

会場となる小会議室はインターネット接続がないため、受講者が持ち込むノートPCには「Ruby+Rails+JDK5(以上)」をあらかじめインストールしておいてもらわないといけないのだが、皆さん準備万端で参加してもらい、(USBメモリで)配布した教材も全員のノートPCで問題なく動作し、第1回目にしては上出来であった。

受講者の半数以上はMacを持ち込んでの参加であったのも印象深かった。こちらの記事で紹介したとき以来、普段から不満たらたらでVistaノートを使っている私は「次に買うときは私もMacに決めているんですよ」と負け惜しみを言うのが精一杯であった。

受講者アンケートもとらせてもらったが、ほぼ100%の満足度が得られたようで、よかった。受講者の方でさっそく記事にしてくれた方もいる。気分がいいので来月も開催しようと考えている(会議室と私のスケジュールの空き具合で、日程は現在調整中)。

アンケートには「Solr以外の検索エンジンを使用・検討したことがある方」向けに「その検索エンジン」と比較して「Solrが優れている点・Solrが劣っている点」を聞いてみた。受講者の一人が「Solrは(使ったことのある)Luceneと比べてスケーラビリティが劣っている」と回答していた。

この点についてコメントしておきたい。

まずスケールアップに関しては、LuceneでもSolrでもなんら変わるところはないと考えられる。スケールアウトについても同様だ。

だとすると、この方の指摘する「スケーラビリティ」とは(中身の異なる)インデックスを横断検索するLuceneでいうところのMultiSearcher機能がSolrにはない、といっているのかもしれない。

無料セミナーで使用したSolrの安定版であるリリース1.2ではこれは正しい。

しかし、現在開発中のSolr 1.3ではDistributed Search機能が導入される予定であり、「億オーダ」を超える検索対象文書数を扱えるようになる(Distributed Search機能を使わないときの理論値は最大約21億件(=Integer.MAX_VALUE))。LinuxWorldでも話したが、SolrのDistributed Search機能ではLuceneのdocidのIntegerをLongに変換することから、理論上900京件超の文書数が扱えるようになる。

Solrのこの横断検索機能はGoogleの分散検索処理と同じしくみ(シーケンス)で動作しているため、十分スケールすることは(Googleによって)すでに証明済み、といってもよいだろう。

「Googleの分散検索処理」については技術評論社発行のGoogleを支える技術」の第2章に記載されている。Solr 1.3のDistributed Searchはこれと同様である。

もっとも、1億件くらいまでなら従来のままの構成でもなんとか動かそうと思えば動くものである。
| 関口宏司 | Luceneセミナー | 06:51 | comments(1) | trackbacks(0) |
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) |
Web Spam Detection for Heritrix - Heritrix用Webスパム発見器
Google Summer of Code 2008でWebスパムページをHeritrixで見つけるプラグインを開発している人がいる:

http://webteam.archive.org/confluence/display/Heritrix/Web+Spam+Detection+for+Heritrix

ざっと読んだところ、Webスパムを見つける方法として特に「JavaScriptリダイレクション」と「クローキングスパム」の構造的特徴に注目してそれがスパムの要件を満たしているかどうかを発見するもののようである。

たとえば「JavaScriptリダイレクション」の方法ではWebページに2度訪れたとき(ただし1度目はJavaScriptをON、2度目はOFFにする)、次のアルゴリズムで「JavaScriptリダイレクション」かどうかが判定できる:



// 疑似コード
if DstURL(E) = OrgURL, then
// リダイレクションではない
else if DstURL(E) != DstURL(D) then
// JavaScriptリダイレクションである
else
// JavaScriptリダイレクションではない



ここでOrgURLはオリジナルのURL、DstURL(E)はJavaScriptをONにしたときのデスティネーションURL、DstURL(D)はJavaScriptをOFFにしたときのデスティネーションURLである(実際には2度訪れる必要はなく、JavaScriptを評価すれば見極められる)。

そして「JavaScriptリダイレクション」のときはOrgURL=>DstURL(E)においてたとえば次のような単純なルールを適用してスパムでないページを判定できる:

  • www2007.com => www.2007.com/;
  • www2007.com => www.2007.com/{index, default, ...­}.{htm, html, asp, aspx, php, ...};
  • 同じホスト内へのリダイレクション


これ以外のリダイレクションをJavaScriptリダイレクションスパムであるとみなすことができる。もっともこれだけでは偽陽性(JavaScriptリダイレクションスパムでないサイトもスパムであると判定されてしまうこと)が存在するので、「手動」で判定できるクチを用意するようである。

日本語のWebページでも問題なく使えそうなプログラムなので、興味のある人は使ってみてはどうだろう(使ったらぜひ感想を聞かせてください)。

| 関口宏司 | クローラー | ロボット | スパイダー | 00:19 | comments(0) | trackbacks(0) |
第1回 Rails開発者向け全文検索エンジンSolrの無料セミナー開催
Ruby on Rails開発者向けに全文検索エンジンSolrの入門セミナー(無料)を開催する。

日時:6月25日(水) 14:00-16:00
場所:株式会社ロンウイット(東京都千代田区丸の内) 会議室
内容:
1. 日本語全文検索の基礎
最初に日本語全文検索について簡単におさらいします。
2. Apache Solrのインストールと起動
各自のノートPCに実際にApache Solrをインストールし、起動方法を学びます。
3. ドキュメントの登録
こちらで演習用に用意したドキュメントをApache Solrに登録します。
4. ドキュメントの検索
登録したドキュメントをApache Solrの管理画面を使って検索します。
5. Railsアプリケーションからの検索
フリーワード検索を実行するRailsアプリケーションを作成します。

お申し込みは以下のフォームからどうぞ!

http://www.rondhuit.com/seminar.html
| 関口宏司 | Luceneセミナー | 20:01 | comments(0) | trackbacks(1) |
LUCENE-794のデモへの適用
現在開発中のSolr 1.3のLuceneライブラリがアップデートされ、LUCENE-794の修正が取り込まれた:

https://issues.apache.org/jira/browse/LUCENE-794

LUCENE-794はフレーズのハイライトを正確に行うという新機能(フレーズのハイライトが正確に行えなかったこれまでのHighlighterは、それは「不具合」ではなく「仕様」という認識である)の追加である。「新機能」なので従来のQueryScorerを使うと従来のままの動作となる。つまりフレーズを構成する単語が独立していてもハイライトの対象となってしまう。

LUCENE-794で追加されたSpanScorerを使用するとフレーズが対象の場合はフレーズをハイライトし、フレーズを構成している単語が単独のものはハイライト対象からはずれるようになる(ただし、ハイライトの単位は単語単位となる。この意味は下記にあるとおりデモで実際にフレーズを検索してみて、検索結果画面HTMLの「ソースの表示」をしてみるとわかるのでやってみよう)。

このブログを検索するデモに早速この機能を取り込んでみた。

「検索性能」という検索語(フレーズ)で検索すると、これまでは次のように「検索」という独立した単語でもハイライトされてしまっていた:

before LUCENE-794

しかし最新のSolr trunkを適用した現在は、次のように「検索」という独立した単語はハイライトされなくなる:

after LUCENE-794

もっとも、この例ではAnalyzerに形態素解析を使用し、検索フレーズも「お行儀がよい」ためにあまり改善した印象を受けないかもしれない(Googleでも最初の図のようなハイライトが実際に行われるし)。AnalyzerにN-gramを使用したり、フレーズが細かい単語から構成される場合は、この改善のありがたみがよくわかる。
| 関口宏司 | Luceneデモ | 19:07 | comments(0) | trackbacks(0) |
+ Solrによるブログ内検索
+ PROFILE
1234567
891011121314
15161718192021
22232425262728
2930     
<< June 2008 >>
+ 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