Feb 16, 2011

Apache Solr 1.4 Filter の作成 DigitFilter, KatakanaStemFilter

以下、POSFilter と同様にして、
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