Nikt nie udzielił zadowalającej odpowiedzi, więc zaczęliśmy szperać w dokumentacji Lucene i odkryliśmy, że możemy to zrobić za pomocą niestandardowych analizatorów i tokenizerów.
Odpowiedź jest następująca: utwórz WhitespaceAndAtSymbolTokenizer i WhitespaceAndAtSymbolAnalyzer, a następnie utwórz indeks za pomocą tego analizatora. Gdy to zrobisz, wyszukiwanie "@ gmail.com" zwróci wszystkie adresy w Gmailu, ponieważ jest to oddzielne słowo dzięki utworzonemu przez nas Tokenizerowi.
Oto kod źródłowy, to faktycznie bardzo prosta:
class WhitespaceAndAtSymbolTokenizer : CharTokenizer
{
public WhitespaceAndAtSymbolTokenizer(TextReader input)
: base(input)
{
}
protected override bool IsTokenChar(char c)
{
// Make whitespace characters and the @ symbol be indicators of new words.
return !(char.IsWhiteSpace(c) || c == '@');
}
}
internal class WhitespaceAndAtSymbolAnalyzer : Analyzer
{
public override TokenStream TokenStream(string fieldName, TextReader reader)
{
return new WhitespaceAndAtSymbolTokenizer(reader);
}
}
To jest to! Teraz wystarczy przebudować swój indeks i wykonać wszystkie wyszukiwania przy użyciu tego nowego analizatora. Na przykład, aby zapisywać dokumenty do indeksu:
IndexWriter index = new IndexWriter(indexDirectory, new WhitespaceAndAtSymbolAnalyzer());
index.AddDocument(myDocument);
wyszukiwania sceniczne powinny używać analizatora, a także:
IndexSearcher searcher = new IndexSearcher(indexDirectory);
Query query = new QueryParser("TheFieldNameToSearch", new WhitespaceAndAtSymbolAnalyzer()).Parse("@gmail.com");
Hits hits = query.Search(query);
Mogę również przekazać tokenizator przez LowerCaseFilter lub niestandardowy LowerCaseFilter, który będzie tylko mały znacznik @ GmAil.COM –