[ 
https://issues.apache.org/jira/browse/SOLR-822?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12644955#action_12644955
 ] 

Koji Sekiguchi commented on SOLR-822:
-------------------------------------

Hoss, sorry for the late reply.

{quote}
1) if i understand correctly: another use case beyond character normalization 
could be refactoring the existing HTMLStrip___Tokenizers so that instead people 
would use an HTMLStripCharFilter and then whatever tokenizer they like, correct?
{quote}

Correct.

{quote}
3) should CharStream extend FilterReader?
{quote}

I think we need all these classes to construct the CharFilter framework - 
CharStream, CharReader and CharFilter. CharReader and CharFilter are the 
subclass of CharStream. CharStream has an abstract method correctOffset():

{code:java}
public abstract class CharStream extends Reader {
  /**
   * called by CharFilter(s) and Tokenizer to correct token offset.
   *
   * @param currentOff current offset
   * @return corrected token offset
   */
  public abstract int correctOffset( int currentOff );
}
{code}

CharStream extends Reader instead of FilterReader because FilterReader has a 
Reader member but I don't need it. Instead, CharReader has a Reader and 
CharFilter has CharStream. The role of CharReader is that it wraps Reader and 
makes it CharStream.

{code:java}
public final class CharReader extends CharStream {
  protected Reader input;
  public CharReader( Reader in ){
    input = in;
  }
  @Override
  public int correctOffset(int currentOff) {
    return currentOff;
  }
  :
}
{code}

Then CharReader is placed at the beginning of char-filter-chain. Now we get 
CharStream, CharFilters can be used to organize
a filter chain. I made the correctOffset() to final in CharFilter.

{code:java}
public abstract class CharFilter extends CharStream {
  protected CharStream input;
  protected CharFilter( CharStream in ){
    input = in;
  }
  protected int correctPosition( int pos ){
    return pos;
  }
  @Override
  public final int correctOffset(int currentOff) {
    return input.correctOffset( correctPosition( currentOff ) );
  }
  :
}
{code}

Subclass of CharFilter can override correctPosition() method to correct current 
position.

{quote}
2) based on your explanation, shouldn't CharFilterFactory be renamed 
CharStreamFactory ? ... there's no requirement that implementations produce a 
CharFilter, as long as they produce a ChaStream, correct?
{quote}

Yes, CharFilterFactory creates CharStream but I like CharFilterFactory because 
1) the factory will instanciate CharFilter (not CharStream) and 2) the return 
type of TokenFilterFactory.create() is TokenStream although it instantiates 
TokenFilter.

{quote}
Something else to consider: it seems like a lot of future headache could be 
simplied if the CharStream API was committed in lucene-java so that the 
Tokenizer API and all of the existing OOTB Tokenizers could know about it.
{quote}

Agreed. I'll open a ticket in Lucene.

> CharFilter - normalize characters before tokenizer
> --------------------------------------------------
>
>                 Key: SOLR-822
>                 URL: https://issues.apache.org/jira/browse/SOLR-822
>             Project: Solr
>          Issue Type: New Feature
>          Components: Analysis
>            Reporter: Koji Sekiguchi
>            Priority: Minor
>         Attachments: character-normalization.JPG, sample_mapping_ja.txt, 
> SOLR-822.patch, SOLR-822.patch, SOLR-822.patch
>
>
> A new plugin which can be placed in front of <tokenizer/>.
> {code:xml}
> <fieldType name="textCharNorm" class="solr.TextField" 
> positionIncrementGap="100" >
>   <analyzer>
>     <charFilter class="solr.MappingCharFilterFactory" 
> mapping="mapping_ja.txt" />
>     <tokenizer class="solr.MappingCJKTokenizerFactory"/>
>     <filter class="solr.StopFilterFactory" ignoreCase="true" 
> words="stopwords.txt"/>
>     <filter class="solr.LowerCaseFilterFactory"/>
>   </analyzer>
> </fieldType>
> {code}
> <charFilter/> can be multiple (chained). I'll post a JPEG file to show 
> character normalization sample soon.
> MOTIVATION:
> In Japan, there are two types of tokenizers -- N-gram (CJKTokenizer) and 
> Morphological Analyzer.
> When we use morphological analyzer, because the analyzer uses Japanese 
> dictionary to detect terms,
> we need to normalize characters before tokenization.
> I'll post a patch soon, too.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to