DigitFilter, KatakanaStemFilterを作成します。
各 Factory クラスは、create するだけなので、非常に単純で、以下のような内容です。
public class DigitFilterFactory extends BaseTokenFilterFactory { public TokenStream create(TokenStream input) { return new DigitFilter(input); } }
そして、Filter クラスは以下のような感じです。
public class DigitFilter extends TokenFilter { boolean preRead; String preTerm; String preType; int preStart; int preEnd; protected DigitFilter(TokenStream input) { super(input); preRead = false; preTerm = preType = null; preStart = preEnd = 0; } public Token next(Token token) throws IOException { if (preRead) { preRead = false; return preTerm == null ? null : token.reinit(preTerm, preStart, preEnd, preType); } Token t = input.next(token); if (t == null) return null; char[] c; // for termBuffer if (t.termLength() == 1 && Character.isDigit((c = t.termBuffer())[0])) { int start = t.startOffset(); int end = t.endOffset(); String type = t.type(); StringBuilder st = new StringBuilder(); st.append(c[0]); while (true) { t = input.next(token); if (t == null) { preRead = true; preTerm = null; break; } else if (t.termLength() != 1 || !Character.isDigit((c = t.termBuffer())[0])) { preRead = true; preTerm = new String(c, 0, t.termLength()); preStart = t.startOffset(); preEnd = t.endOffset(); preType = t.type(); break; } st.append(c[0]); end = t.endOffset(); } return token.reinit(st.toString(), start, end, type); } 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" /> <filter class="DigitFilterFactory" /> <filter class="solr.LowerCaseFilterFactory" /> <filter class="KatakanaStemFilterFactory" /> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords-ja.txt" /> </analyzer> </fieldType>
これで、SysnonymFilter も追加できますね。
※ 2/18 WordJoinFilter は問題があったので削除しました。
No comments:
Post a Comment