6

Grails Searchable Pluginアクセントを使用せずに全文検索を行う方法は?

4

1 に答える 1

5

Peter Ledbrookの投稿の助けを借りてこの問題を解決しましたが、いくつかの努力が必要でした。

最新の検索可能なプラグインはASCIIFoldingFilter(2.9.0以降で使用可能)を含まないLucene 2.4.1を使用し、 ISOLatin1AccentFilterは多くの言語をサポートしていないため、アクセントを取り除くためのカスタムフィルターを作成しました。



    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' 
]
于 2011-09-23T02:48:49.877 に答える