Solr のインデックスに Python ( Jython ) から Lucene ライブラリを使ってアクセスする その2 NGramTokenizer と LowerCaseFilter を使って見る

NGramTokenizer と LowerCaseFilter を同時に使って検索するコードのサンプルです。
標準では NGramTokenizer 用の Analyzer は用意されていないので NGramAnalyzer を作成しています。
NGramTokenizer は lucene-analyzers-X.X.jar に入っているのでクラスパスを通しときます。
LowerCaseFilter はアルファベットの大文字小文字の正規化をしてくれます。SONYSonysony は全て sony に変換されます。


Python で書けると便利。

#! /usr/local/jython2.5.1/jython
# coding=utf-8

# 検索サンプル
# NGramTokenizer + LowerCaseFilter の例

import sys
import string

from org.apache.lucene.store import FSDirectory
from org.apache.lucene.search import IndexSearcher

from org.apache.lucene.queryParser import QueryParser
from org.apache.lucene.analysis.ngram import NGramTokenizer
from org.apache.lucene.analysis import Analyzer
from org.apache.lucene.analysis import LowerCaseFilter

# NGramTokenizer 用の Analyzer を作る
class NGramAnalyzer(Analyzer):
 def __init__(self, minGram, maxGram):
  self.minGram = minGram;
  self.maxGram = maxGram;

 def tokenStream( self, fieldName, reader):
  t = NGramTokenizer(reader, self.minGram, self.maxGram)
  t = LowerCaseFilter(t)
  return t

if __name__ == "__main__":
 indexPath = "/Solrのインデックスディレクトリ/index"
 dir = FSDirectory.getDirectory(indexPath, False)
 searcher = IndexSearcher( dir );

 # 1-Gram
 analyzer = NGramAnalyzer(1, 1)
 searchWord=u'ほげ'

 query = QueryParser('FIELD1', analyzer).parse(searchWord)

 hits = searcher.search(query);
 numHits = hits.length()

 print 'numHits:', numHits

 for i in range(0, numHits):
  doc = hits.doc(i)
  print i, doc.get('FIELD1'), doc.get('FIELD2')