NGramTokenizer は 1024 文字 までしかパースしてくれないのでちょっと増やしてみた

  • 修正

hi_time 様から下記のコメントいただきました。
ご指摘の設定の方が洗練されていると思いますので、この記事の役割を問題の提起とhi_time 様の解決方法の紹介と変えさせていただければと思います。

hi_time 様コメントありがとうございました。

hi_time
いつもBlogを拝見させていただいております。
そうなんですよね。僕もこの件をシステムのリリース直前でわかって
焦ったのですがNGramFilterFactoryは文字数制限はないようなので以下のようにして逃げの対応しました。

<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.NGramFilterFactory" maxGramSize="1" minGramSize="1" />
<filter class="solr.LowerCaseFilterFactory" />

なんで1024までなんだろう?
  • 以下、修正前記事

Solr の NGramTokenizer は フィードされた文字列のうち先頭の1024文字だけをパースして、それ以降は捨てるという仕様になっています。
長いテキストを入れた場合には後半の方は検索できないなんてことが起きます。


NGramTokenizer.java の 106 行目に書かれている配列の宣言をちょっといじってみました。

char[] chars = new char[1024];
↓
char[] chars = new char[10240];


あとは ant して lucene-analyzers-common-4.0-dev.jar を入れ替えると 10 倍の量が検索できるようになります。


ホントはもうちょっとカッコヨク直したかったのですが 時間がなかったのでとりあえず 0 足しときました。