Filter も Tokenizer と同様に、Factory クラスを作成し、Filter を create します。
Factoryクラスは、「 org.apache.solr.analysis.BaseTokenFilterFactory 」を継承し、
createメソッドを実装すればOKですが、設定ファイルをロードする必要がある場合などは、
「 org.apache.solr.util.plugin.ResourceLoaderAware 」を implement して、
inform メソッドを実装します。
このあたりは、Solr 本付属のソースや、
org.apache.solr.analysis.StopFilterFactory のソースなどが参考になります。
まずは、POSFilterFactory.class と、POSFilter.class を作成します。
POSFilterFactory.class で作成する 設定ファイルから読み込む POS情報ですが、
スレッド間で同期する必要がないので、Solr 本と同様に Set で実装します。
なので、POSFilterFactory のソースの抜粋は、以下のように。
public class POSFilterFactory extends BaseTokenFilterFactory implements ResourceLoaderAware { private Set<string> posSet; public void inform(ResourceLoader loader) { try { List<string> alist = loader.getLines(denyPOSFile); posSet = POSFilter.makePOSSet(alist); } catch (IOException e) { throw new RuntimeException(e); } } public TokenStream create(TokenStream input) { return new POSFilter(input, posSet); } }
public final class POSFilter extends TokenFilter { private final Set<string> posSet; public POSFilter(TokenStream input, Set<string> posSet) { super(input); this.posSet = posSet; } public final static Set<string> makePOSSet(List<string> posList) { if (posList == null) throw new NullPointerException("posList is null"); return new HashSet<string>(posList); } public final Token next(Token token) throws IOException { Token t; while (true) { t = input.next(token); if (t == null) return null; if (posSet == null || !posSet.contains(t.type())) break; } return t; } }
これで、fieldType の以下の部分までができました。
<fieldType name="text_ja" class="solr.TextField"> <analyzer> <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ja.txt" /> <tokenizer class="SenTokenizerFactory" /> <filter class="POSFilterFactory" deny="pos-deny.txt" /> </analyzer> </fieldType>
No comments:
Post a Comment