Lucene.NET 4.8.0: Как с помощью анализатора разбить текст?
Как правильно настроить анализатор для разбития текста?
Например: "st3-g5.my.vk.com" -> "st3" "g5" "my" "vk" "com"
Больше всего подошёл SimpleAnalyzer, но он удаляет числа.
Пробовал создать свой анализатор, но так и не получилось добиться требуемого результата:
public class CustomAnalyzer : Analyzer
{
protected override TokenStreamComponents CreateComponents(string fieldName, TextReader reader)
{
StandardTokenizer src = new StandardTokenizer(LuceneVersion.LUCENE_48, reader);
TokenStream tok = new StandardFilter(LuceneVersion.LUCENE_48, src);
tok = new LowerCaseFilter(LuceneVersion.LUCENE_48, tok);
return new TokenStreamComponents(src, tok);
}
protected TextReader initReader(string fieldName, TextReader reader)
{
NormalizeCharMap.Builder builder = new();
builder.Add(".", " ");
builder.Add("_", " ");
NormalizeCharMap normMap = builder.Build();
return new MappingCharFilter(normMap, reader);
}
}
Ответы (1 шт):
Автор решения: Relins
→ Ссылка
Ошибка была в название метода initReader -> InitReader, теперь все работает.
public class CustomAnalyzer : Analyzer
{
private LuceneVersion matchVersion;
public CustomAnalyzer(LuceneVersion matchVersion)
{
this.matchVersion = matchVersion;
BuildMap();
}
protected override TokenStreamComponents CreateComponents(string fieldName, TextReader reader)
{
Tokenizer src = new ClassicTokenizer(matchVersion, reader);
TokenStream tok = new StandardFilter(matchVersion, src);
tok = new LowerCaseFilter(matchVersion, tok);
tok = new StopFilter(matchVersion, tok, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
return new TokenStreamComponents(src, tok);
}
private NormalizeCharMap map;
public void BuildMap()
{
NormalizeCharMap.Builder builder = new NormalizeCharMap.Builder();
builder.Add(".", " ");
builder.Add("-", " ");
builder.Add("/", " ");
map = builder.Build();
}
protected override TextReader InitReader(string fieldName, TextReader reader)
{
return new MappingCharFilter(map, reader);
}
}