6
如何使用Grails Searchable Plugin不區分重音的全文搜索?Grails中對口音不敏感的搜索
如何使用Grails Searchable Plugin不區分重音的全文搜索?Grails中對口音不敏感的搜索
我已經解決了這個問題的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'
]