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のディレクトリ直下で行います。
ファイルをインデックスする
$ 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のコードを読んでみて、各クラスの役割をざっくりと調べてソースコードリーディングする箇所を決めていきたいと思います。