2011-09-22 70 views

回答

5

我已經解決了這個問題的Peter Ledbrook's post幫助,但需要一些努力:

由於最新的搜索插件使用Lucene的2.4.1不包含ASCIIFoldingFilter(可用自2.9.0)和ISOLatin1AccentFilter不支持多國語言我已創建自定義過濾器用於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 
     } 
    } 

和相應的過濾器提供商:



    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) 
     } 

    } 

現在,所有你需要做的就是註冊在搜索插件的配置中,該過濾器供應商(在grails-app/conf目錄/ Searchable.groovy):

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