Custom Solr TokenFilter lemmatizer

java, solr

Solution

Next, you want to `replace` or `append` the current token `termAtt` with your word.

Sample replace semantics

termAtt.setEmpty();
termAtt.copyBuffer(word.toCharArray(), 0, word.length());

Sample semantics of adding new tokens

For each token you want to add, the `CharTermAttribute` attribute must be set and the `incrementToken` routine to return true.

private List<String> extraTokens = ...
public boolean incrementToken() { 
  if (input.incrementToken()){ 
    // ... 
    return true; 
  } else if (!extraTokens.isEmtpy()) { 
    // set the added token and return true
    termAtt.setTerm(extraTokens.remove(0)); 
    return true; 
  } 
  return false; 
} 

Problem

I'm trying to write a simple Solr lemmatizer for use in a field type, but I can't seem to find any information about writing a TokenFilter so I'm kind of lost. Here is the code I have so far. ``` import java.io.IOException; import java.util.List; import org.apache.lucene.analysis.TokenFilter; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute; import org.slf4j.Logger; import org.slf4j.LoggerFactory; class FooFilter extends TokenFilter { private static final Logger log = LoggerFactory.getLogger(FooFilter.class); private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class); private final PositionIncrementAttribute posAtt = addAttribute(PositionIncrementAttribute.class); public FooFilter(TokenStream input) { super(input); } @Override public boolean incrementToken() throws IOException { if (!input.incrementToken()) { return false; } char termBuffer[] = termAtt.buffer(); List<String> allForms = Lemmatize.getAllForms(new String(termBuffer)); if (allForms.size() > 0) { for (String word : allForms) { // Now what? } } return true; } } ```

Original source