【问题标题】:Accent insensitive search in GrailsGrails 中的重音不敏感搜索
【发布时间】:2011-11-22 21:16:14
【问题描述】:

如何使用Grails Searchable Plugin不区分重音进行全文搜索?

【问题讨论】:

    标签: grails diacritics compass-lucene grails-searchable


    【解决方案1】:

    我已经在Peter Ledbrook's post 的帮助下解决了这个问题,但是还需要一些努力:

    由于最新的可搜索插件使用不包含 ASCIIFoldingFilter(自 2.9.0 起可用)的 Lucene 2.4.1 并且 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' 
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 2012-01-28
      • 2011-04-06
      相关资源
      最近更新 更多