読者です 読者をやめる 読者になる 読者になる

Luceneソースコードリーディングの準備その1

同じ部署の方の発案でLuceneソースコードリーディングが開催される運びとなり、ノリで参加を表明してしまいました。
検索まわりは全く素人なわけですが、これを機会に色々と学んでい効果と思います。

検索エンジンまわりの話をつかむ

元同僚、現ピーFIの@takahi-iさんがお書きになった文章が概要をつかむのにうってつけでした。
ビッグデータ処理の常識をJavaで身につける(1):検索エンジンの常識をApache Solrで身につける (1/4) - @IT

こちらもわかりやすかったですね。
Lucene | TECHSCORE(テックスコア)

ちなみに、この段階での私の検索エンジンの理解度は

という感じでした。なかなか残念ですね。

とりあえずここまで色々と調べて

  • Luceneはインデックスなどをお気軽に作成してくれるAPIを提供してくれるライブラリ
  • Luceneをインストールさえすれば簡単に検索エンンジンが完成するわけではなく、検索エンジンの肝の部分に相当する役割を果たしてくれる
  • Solrは検索サーバーとして検索エンジンのアプリケーション側を提供してくれる
  • 日本語周りをうまくインデックスするためにsen, gosen, Lucene-gosenなどの形態素解析のライブラリがある。

こんな感じかなぁと。

Luceneのdemoを動かす

説明を長々と読んでいてもイメージがわかないので実際に動かしてみます。
Apache Lucene - Getting Started Guide
Apache Lucene - Building and Installing the Basic Demo
Apache Lucene - Basic Demo Sources Walk-through

このデモで、Luceneを使って適当なファイルをインデックスして、検索ができるまでを体験できます。

コードをとってくる

正確にはdemo用のjarファイルが欲しいだけですが。
ここからなどで取得すればよいかと思います。
解凍した後のディレクトリにある

  • lucene-core-3.5.jar(直下にある)
  • contrib/demo/lucene-demo-3.5.0.jar

へクラスパスを通しておきます。

以後作業はLuceneのディレクトリ直下で行います。

ファイルをインデックスする

$ java org.apache.lucene.demo.IndexFiles -docs (インデックスしたいファイル群のあるディレクトリ)

自分の場合は、Luceneのソースが含まれているものを別に落としてきて、それをインデックスしてみます。

$ java org.apache.lucene.demo.IndexFiles -docs ../lucene-3.5.0/src/
Indexing to directory 'index'...
adding ../lucene-3.5.0/src/java/org/apache/lucene/analysis/Analyzer.java
adding ../lucene-3.5.0/src/java/org/apache/lucene/analysis/ASCIIFoldingFilter.java
adding ../lucene-3.5.0/src/java/org/apache/lucene/analysis/BaseCharFilter.java
adding ../lucene-3.5.0/src/java/org/apache/lucene/analysis/CachingTokenFilter.java
adding ../lucene-3.5.0/src/java/org/apache/lucene/analysis/CharArrayMap.javaadding ../lucene-3.5.0/src/java/org/apache/lucene/analysis/CharArraySet.javaadding ../lucene-3.5.0/src/java/org/apache/lucene/analysis/CharFilter.java
adding ../lucene-3.5.0/src/java/org/apache/lucene/analysis/CharReader.java
adding ../lucene-3.5.0/src/java/org/apache/lucene/analysis/CharStream.java
adding ../lucene-3.5.0/src/java/org/apache/lucene/analysis/CharTokenizer.java
adding ../lucene-3.5.0/src/java/org/apache/lucene/analysis/FilteringTokenFilter.java
adding ../lucene-3.5.0/src/java/org/apache/lucene/analysis/ISOLatin1AccentFilter.java
adding ../lucene-3.5.0/src/java/org/apache/lucene/analysis/KeywordAnalyzer.java
(中略)
adding ../lucene-3.5.0/src/tools/prettify/lang-apollo.js
adding ../lucene-3.5.0/src/tools/prettify/lang-css.js
adding ../lucene-3.5.0/src/tools/prettify/lang-hs.js
adding ../lucene-3.5.0/src/tools/prettify/lang-lisp.js
adding ../lucene-3.5.0/src/tools/prettify/lang-lua.js
adding ../lucene-3.5.0/src/tools/prettify/lang-ml.js
adding ../lucene-3.5.0/src/tools/prettify/lang-proto.js
adding ../lucene-3.5.0/src/tools/prettify/lang-sql.js
adding ../lucene-3.5.0/src/tools/prettify/lang-vb.js
adding ../lucene-3.5.0/src/tools/prettify/lang-wiki.js
adding ../lucene-3.5.0/src/tools/prettify/prettify.css
adding ../lucene-3.5.0/src/tools/prettify/prettify.js
adding ../lucene-3.5.0/src/tools/prettify/stylesheet+prettify.css
3358 total milliseconds

おお、何やらもりもりとaddingされています。
これでインデックス作成は完了のようで、同じ場所にindexというディレクトリが作成されているのが確認できます。

ファイルを検索する

$ java org.apache.lucene.demo.SearchFiles

と実行すると、queryを要求されるプロンプトが起動します。

java org.apache.lucene.demo.SearchFiles                         
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 -Xmx1024m -Xms512m
Enter query:
hoge
Searching for: hoge
0 total matching documents
Enter query:
test
Searching for: test
299 total matching documents
1. ../lucene-3.5.0/src/test-framework/java/org/apache/lucene/util/LuceneJUnitResultFormatter.java
2. ../lucene-3.5.0/src/site/src/documentation/skins/common/skinconf.xsl
3. ../lucene-3.5.0/src/site/build/site/skin/skinconf.xsl
4. ../lucene-3.5.0/src/site/src/documentation/skins/lucene/skinconf.xsl
5. ../lucene-3.5.0/src/test/org/apache/lucene/search/function/TestFieldScoreQuery.java
6. ../lucene-3.5.0/src/test/org/apache/lucene/util/TestArrayUtil.java
7. ../lucene-3.5.0/src/test/org/apache/lucene/analysis/TestStopAnalyzer.java
8. ../lucene-3.5.0/src/test/org/apache/lucene/util/TestIOUtils.java
9. ../lucene-3.5.0/src/test-framework/java/org/apache/lucene/util/ThreeLongs.java
10. ../lucene-3.5.0/src/test/org/apache/lucene/search/function/TestOrdValues.java
Press (n)ext page, (q)uit or enter number to jump to a page.

"hoge"はヒットせず、"test"は299ファイルがマッチして、先頭の10件が表示されていることがわかります。

というわけで、demoを動かして、ベーシックな検索機能が実現できることが確認できました。

  • インデックスを作成する機能
  • クエリとインデックスを照らしあわせて検索結果を返す機能
  • ヒットした検索結果をなんらかの仕組みにしたがってランキング付けしている機能

なんかがあるんだろうなぁと妄想できます。

次はdemoのコードを読んでみて、各クラスの役割をざっくりと調べてソースコードリーディングする箇所を決めていきたいと思います。