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