2011-09-22 9 views

risposta

5

ho risolto questo problema con l'aiuto di Peter Ledbrook's post, però qualche sforzo è stato necessario:

Da ultimo plugin ricercabile usa Lucene 2.4.1 che non contiene ASCIIFoldingFilter (disponibile dal 2.9.0) e ISOLatin1AccentFilter non lo fa supportare molte lingue che ho creato per il filtro personalizzato stripping accents:



    import java.text.Normalizer 
    import org.apache.lucene.analysis.Token 
    import org.apache.lucene.analysis.TokenFilter 
    import org.apache.lucene.analysis.TokenStream 

    class StripAccentsFilter extends TokenFilter { 

     StripAccentsFilter(TokenStream input) { 
      super(input) 
     } 

     public final Token next(Token reusableToken) { 

      assert reusableToken 

      Token nextToken = input.next(reusableToken) 
      if (nextToken) { 
       nextToken.setTermBuffer(Normalizer.normalize(nextToken.termBuffer() as String, Normalizer.Form.NFD) 
         .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")) 
       return nextToken 
      } 
      return null 
     } 
    } 

e corrispondente fornitore di filtro:



    import org.apache.lucene.analysis.TokenStream 
    import org.compass.core.config.CompassSettings 
    import org.compass.core.lucene.engine.analyzer.LuceneAnalyzerTokenFilterProvider 

    class StripAccentsFilterProvider implements LuceneAnalyzerTokenFilterProvider { 

     public void configure(CompassSettings paramCompassSettings) { 
     } 

     public TokenStream createTokenFilter(TokenStream paramTokenStream) { 
      return new StripAccentsFilter(paramTokenStream) 
     } 

    } 

Ora tutto quello che dovete fare è registrarsi questo fornitore di filtro nella configurazione del plugin di ricercabile (graal-app/conf/Searchable.groovy):

compassSettings = [ 
    'compass.engine.analyzer.default.filters': 'stripAccents', 
    'compass.engine.analyzer.search.filters': 'stripAccents', 
    'compass.engine.analyzerfilter.stripAccents.type': 'StripAccentsFilterProvider' 
]