Если вы используете StandardAnalyzer
, это приведет к удалению не буквенных символов.Попробуйте индексировать то же значение с помощью WhitespaceAnalyzer
и посмотрите, сохранит ли оно нужные вам символы.Он также может хранить вещи, которые вам не нужны: вот когда вы можете подумать о написании собственного Analyzer, что в основном означает создание стека TokenStream, который выполняет именно тот тип обработки, который вам необходим.
Например, SimpleAnalyzer
реализует следующий конвейер:
@Override
public TokenStream tokenStream(String fieldName, Reader reader) {
return new LowerCaseTokenizer(reader);
}
, который просто вводит токены в нижнем регистре.
StandardAnalyzer
делает гораздо больше:
/** Constructs a {@link StandardTokenizer} filtered by a {@link
StandardFilter}, a {@link LowerCaseFilter} and a {@link StopFilter}. */
@Override
public TokenStream tokenStream(String fieldName, Reader reader) {
StandardTokenizer tokenStream = new StandardTokenizer(matchVersion, reader);
tokenStream.setMaxTokenLength(maxTokenLength);
TokenStream result = new StandardFilter(tokenStream);
result = new LowerCaseFilter(result);
result = new StopFilter(enableStopPositionIncrements, result, stopSet);
return result;
}
Вы можете смешивать исовпадают с этими и другими компонентами в org.apache.lucene.analysis
, или вы можете написать свои собственные специализированные TokenStream
экземпляры, которые обернуты в конвейер обработки вашим пользовательским Analyzer
.
Еще одна вещь, на которую стоит обратить внимание, это то, чтовроде CharTokenizer
вы используете.CharTokenizer
- это абстрактный класс, который определяет механизм токенизации текстовых строк.Он используется некоторыми более простыми анализаторами (но не StandardAnalyzer
).Lucene поставляется с двумя подклассами: LetterTokenizer
и WhitespaceTokenizer
.Вы можете создать свой собственный, который хранит нужные вам символы и разбивает на те, которые вам не нужны, реализуя метод boolean isTokenChar(char c)
.