Я решил эту проблему с помощью сообщения Питера Ледбрука , однако потребовались некоторые усилия:
Поскольку последний подключаемый модуль с возможностью поиска использует Lucene 2.4.1, который не содержит ASCIIFoldingFilter (доступно с версии 2.9.0) и 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'
]