Không ai đưa ra câu trả lời thỏa đáng, vì vậy chúng tôi bắt đầu tìm hiểu về tài liệu Lucene và phát hiện ra chúng tôi có thể thực hiện việc này bằng cách sử dụng Trình phân tích và Mã thông báo tùy chỉnh.
Câu trả lời là: tạo WhitespaceAndAtSymbolTokenizer và WhitespaceAndAtSymbolAnalyzer, sau đó tạo lại chỉ mục của bạn bằng cách sử dụng trình phân tích này. Khi bạn thực hiện việc này, tìm kiếm "@ gmail.com" sẽ trả về tất cả các địa chỉ gmail, bởi vì nó được xem như một từ riêng biệt nhờ vào Tokenizer mà chúng tôi vừa tạo.
Dưới đây là mã nguồn, nó thực sự rất đơn giản:
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);
}
}
Vậy là xong! Bây giờ bạn chỉ cần xây dựng lại chỉ mục của bạn và thực hiện tất cả các tìm kiếm bằng cách sử dụng Bộ phân tích mới này. Ví dụ, để viết các tài liệu chỉ mục của bạn:
IndexWriter index = new IndexWriter(indexDirectory, new WhitespaceAndAtSymbolAnalyzer());
index.AddDocument(myDocument);
tìm kiếm Performing nên sử dụng máy phân tích cũng như:
IndexSearcher searcher = new IndexSearcher(indexDirectory);
Query query = new QueryParser("TheFieldNameToSearch", new WhitespaceAndAtSymbolAnalyzer()).Parse("@gmail.com");
Hits hits = query.Search(query);
Nguồn
2008-08-21 16:38:40
Tôi cũng sẽ chuyển tokenizer thông qua một LowerCaseFilter, hoặc có lẽ một LowerCaseFilter tùy chỉnh mà sẽ chỉ chữ thường @ GmAil.COM token –