org.apache.lucene.queryParser.QueryParser は、どうやって Field.Index.TOKENIZED と Field.Index.UN_TOKENIZED の判断をしているのだろうか?
というのは、 API reference manual の、UN_TOKENIZED のところには、次のように書いてある。
Index the field's value without using an Analyzer, so it can be searched. As no analyzer is used the value will be stored as a single term. This is useful for unique Ids like product numbers.
ということで、JiroSearch ではタグの検索するために Field に追加する場合、 UN_TOKENIZED を指定していたのだが、 これがどうもうまく検索してくれない。 というか、 UN_TOKENIZED を指定した field も analyzer を call しているような気がする。
ただし、 index を作る時には analyzer を呼んでいないと思われる。 マニュアルの記述をよく読めば、 index を作る時に呼ばないと書いてあるだけであって、 検索する時にも呼ばないとは書いてないような気もする。 ただ、仮にそうだとして、 検索時だけ analyzer を必ず通すというような実装でもうまく検索できるものなのだろうか、 という疑問が生じる。
QueryParser のソースを追いかけてみても、 どこで field (ただしこれはフィールドの名前を示す String であり、Field ではない) を使っているのか分からないというか、 他に丸投げしているだけで、 QueryParser の中では一切 field に関する判定をしていないような気がする。 関口さんのブログの「関口宏司のLuceneブログ | 独自QueryParserの作成(5)」に独自実装した MyQueryParser というクラスのソースが公開されているのだが、 そちらを見ても、 field という String の中身がどうあれ analyzer を呼び出しているような気がする。
じっくり見たわけではないので私が何か見落としている可能性も高い。 一番ありそうなのは、 field が UN_TOKENIZED の場合はそもそも QueryParser に飛んでこない、 というような実装が上位でされている、というような状況の見落としだが、 動かしていると実際呼ばれているとしか思えないような振る舞いをしているような気がしてしょうがない。
また、もし前述のような実装になっているとしたら、 field という String を何のために analyzer を呼び出すときの引数に指定しているのかが分からない。 もしかして、 そのあたりに何か仕掛けがあるのだろうか?