如何使用Grails Searchable Plugin不区分重音进行全文搜索?
问问题
1093 次
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 回答