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