2010-07-28 8 views
3

J'ai une application Lucene standard qui recherche à partir d'un index. Mon index contient beaucoup de termes français et j'aimerais utiliser ASCIIFoldingFilter.Comment utiliser ASCIIFoldingFilter dans mon application Lucene?

Je l'ai fait beaucoup de recherche et je ne sais pas comment l'utiliser. Le constructeur prend un objet TokenStream, puis-je appeler la méthode sur l'analyseur qui récupère un TokenStream lorsque vous lui envoyez un champ? Alors qu'est-ce que je fais? Quelqu'un peut-il me diriger vers un exemple où un TokenFilter est utilisé? Merci.

Répondre

10

Les filtres de jeton - comme le ASCIIFoldingFilter - sont à leur base un TokenStream, ils sont donc quelque chose que l'analyseur retourne principalement par l'utilisation de la méthode suivante:

public abstract TokenStream tokenStream(String fieldName, Reader reader); 

Comme vous l'avez remarqué, les filtres prennent un TokenStream en entrée. Ils agissent comme des wrappers ou, plus exactement, comme decorators à leur entrée. Cela signifie qu'ils améliorent le comportement du TokenStream contenu, exécutant leur opération et le fonctionnement de l'entrée contenue.

Vous pouvez trouver une explication here. Il ne se réfère pas directement à un ASCIIFoldingFilter mais le même principe s'applique. Fondamentalement, vous créez un analyseur personnalisé avec quelque chose comme ça en elle (par exemple dépouillé):

public class CustomAnalyzer extends Analyzer { 
    // other content omitted 
    // ... 
    public TokenStream tokenStream(String fieldName, Reader reader) { 
    TokenStream result = new StandardTokenizer(reader); 
    result = new StandardFilter(result); 
    result = new LowerCaseFilter(result); 
    // etc etc ... 
    result = new StopFilter(result, yourSetOfStopWords); 
    result = new ASCIIFoldingFilter(result); 
    return result; 
    } 
    // ... 
} 

Les deux TokenFilter et Tokenizer sont sous-classes de TokenStream.

Rappelez-vous aussi que vous devez utiliser le même analyseur personnalisé aussi bien dans l'indexation et la recherche ou vous pourriez obtenir des résultats incorrects dans vos requêtes.

4

La structure de la classe abstraite Analyzer semble avoir été changé au fil des années. La méthode tokenStream est définie sur final dans la version actuelle (v4.9.0). La classe suivante devrait faire le travail:

// Accent insensitive analyzer 
public class AccentInsensitiveAnalyzer extends StopwordAnalyzerBase { 
    public AccentInsensitiveAnalyzer(Version matchVersion){ 
     super(matchVersion, StandardAnalyzer.STOP_WORDS_SET); 
    } 

    @Override 
    protected TokenStreamComponents createComponents(String fieldName, Reader reader) { 
     final Tokenizer source = new StandardTokenizer(matchVersion, reader); 

     TokenStream tokenStream = source; 
     tokenStream = new StandardFilter(matchVersion, tokenStream); 
     tokenStream = new LowerCaseFilter(tokenStream); 
     tokenStream = new StopFilter(matchVersion, tokenStream, getStopwordSet()); 
     tokenStream = new ASCIIFoldingFilter(tokenStream); 
     return new TokenStreamComponents(source, tokenStream); 
    } 
} 
Questions connexes